/ Hex Artifact Content
Login

Artifact 457a71a1ebf490d5079ebe36d0213a8025d621a8:


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 35 39 30 20 32 30 30 39 2f 30  c,v 1.590 2009/0
0190: 34 2f 30 35 20 31 32 3a 32 32 3a 30 39 20 64 72  4/05 12:22:09 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72  eTrace=0;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 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: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
48b0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
48c0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
48d0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
48e0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
48f0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
4900: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
4910: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
4920: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
4930: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
4940: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
4950: 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d  rent));.    rc =
4960: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
4970: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
4980: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4990: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
49a0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
49b0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
49c0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
49d0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
49e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
49f0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
4a00: 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75  pDbPage);.  retu
4a10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4a20: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
4a30: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
4a40: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
4a50: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
4a60: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
4a70: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
4a80: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
4a90: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
4aa0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
4ab0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
4ac0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
4ad0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
4ae0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
4af0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
4b00: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
4b10: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
4b20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4b30: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
4b40: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
4b50: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
4b60: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
4b70: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
4b80: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
4b90: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
4ba0: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
4bb0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
4bc0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
4bd0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
4be0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
4bf0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
4c00: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
4c10: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
4c20: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
4c30: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
4c40: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
4c50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4c60: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
4c70: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
4c80: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
4c90: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
4ca0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
4cb0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
4cc0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
4cd0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
4ce0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
4cf0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
4d00: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
4d10: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
4d20: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
4d30: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
4d40: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73  rmap, key);.  as
4d50: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
4d60: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
4d70: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
4d80: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
4d90: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
4da0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
4db0: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
4dc0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
4dd0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
4de0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
4df0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
4e00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
4e10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4e20: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
4e30: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
4e40: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
4e50: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
4e60: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 29  rmapPut(w,x,y,z)
4e70: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
4e80: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
4e90: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
4ea0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
4eb0: 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a 29 20 53  apPutOvfl(y,z) S
4ec0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
4ed0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62  ./*.** Given a b
4ee0: 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20  tree page and a 
4ef0: 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65  cell index (0 me
4f00: 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65  ans the first ce
4f10: 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  ll on.** the pag
4f20: 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73  e, 1 means the s
4f30: 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20  econd cell, and 
4f40: 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e  so forth) return
4f50: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
4f60: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
4f70: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
4f80: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
4f90: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
4fa0: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
4fb0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
4fc0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
4fd0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
4fe0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
4ff0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
5000: 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b  yte(&(P)->aData[
5010: 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  (P)->cellOffset+
5020: 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a  2*(I)])))../*.**
5030: 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d   This a more com
5040: 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20  plex version of 
5050: 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  findCell() that 
5060: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
5070: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
5080: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
5090: 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a  s.  See insert.*
50a0: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e  /.static u8 *fin
50b0: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65  dOverflowCell(Me
50c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
50d0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20  t iCell){.  int 
50e0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
50f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5100: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5110: 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50  x) );.  for(i=pP
5120: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31  age->nOverflow-1
5130: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
5140: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72    int k;.    str
5150: 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70  uct _OvflCell *p
5160: 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20  Ovfl;.    pOvfl 
5170: 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  = &pPage->aOvfl[
5180: 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66  i];.    k = pOvf
5190: 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20  l->idx;.    if( 
51a0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
51b0: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
51c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
51d0: 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20   pOvfl->pCell;. 
51e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65       }.      iCe
51f0: 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ll--;.    }.  }.
5200: 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c    return findCel
5210: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
5220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
5230: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
5240: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
5250: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
5260: 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a  ructure.  There.
5270: 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69  ** are two versi
5280: 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ons of this func
5290: 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74  tion.  sqlite3Bt
52a0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
52b0: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
52c0: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
52d0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
52e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
52f0: 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20  seCellPtr() .** 
5300: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
5310: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
5320: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
5330: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
5340: 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  **.** Within thi
5350: 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73  s file, the pars
5360: 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61  eCell() macro ca
5370: 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  n be called inst
5380: 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ead of.** sqlite
5390: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
53a0: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
53b0: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
53c0: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
53d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
53e0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
53f0: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
5400: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
5410: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
5420: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
5430: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
5440: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
5450: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
5460: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
5470: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
5480: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
5490: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
54a0: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
54b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
54c0: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
54d0: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
54e0: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
54f0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
5500: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
5510: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
5520: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
5530: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5540: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
5550: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
5560: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
5570: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5580: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
5590: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
55a0: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
55b0: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
55c0: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
55d0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
55e0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
55f0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
5600: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
5610: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
5620: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
5630: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
5640: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
5650: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
5660: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
5670: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
5680: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
5690: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
56a0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
56b0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
56c0: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
56d0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
56e0: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
56f0: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
5700: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
5710: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
5720: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
5730: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
5740: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28  eader = n;.  if(
5750: 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64   likely(nPayload
5760: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
5770: 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  l) ){.    /* Thi
5780: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
5790: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
57a0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
57b0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
57c0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
57d0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
57e0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
57f0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69    */.    int nSi
5800: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ze;          /* 
5810: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65  Total size of ce
5820: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79  ll content in by
5830: 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65  tes */.    nSize
5840: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b   = nPayload + n;
5850: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
5860: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
5870: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
5880: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
5890: 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e    if( (nSize & ~
58a0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  3)==0 ){.      n
58b0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
58c0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
58d0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
58e0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
58f0: 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a  Size = (u16)nSiz
5900: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
5910: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
5920: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
5930: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
5940: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
5950: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
5960: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
5970: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
5980: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
5990: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
59a0: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
59b0: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
59c0: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
59d0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
59e0: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
59f0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
5a00: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
5a10: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
5a20: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
5a30: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
5a40: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
5a50: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
5a60: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
5a70: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
5a80: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
5a90: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
5aa0: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
5ab0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
5ac0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
5ad0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
5ae0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
5af0: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
5b00: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
5b10: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
5b20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
5b30: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
5b40: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
5b50: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
5b60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
5b70: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
5b80: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
5b90: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
5ba0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
5bb0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
5bc0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
5bd0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
5be0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
5bf0: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
5c00: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
5c10: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
5c20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5c30: 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20  e - 4);.    if( 
5c40: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
5c50: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
5c60: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
5c70: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  6)surplus;.    }
5c80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
5c90: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
5ca0: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d  )minLocal;.    }
5cb0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
5cc0: 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49  rflow = (u16)(pI
5cd0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29  nfo->nLocal + n)
5ce0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
5cf0: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
5d00: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
5d10: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
5d20: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
5d30: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69   pInfo) \.  sqli
5d40: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
5d50: 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69  lPtr((pPage), fi
5d60: 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20  ndCell((pPage), 
5d70: 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f  (iCell)), (pInfo
5d80: 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  )).void sqlite3B
5d90: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20  treeParseCell(. 
5da0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
5db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
5dc0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5dd0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43  cell */.  int iC
5de0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
5df0: 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e    /* The cell in
5e00: 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c  dex.  First cell
5e10: 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49   is 0 */.  CellI
5e20: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
5e30: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
5e40: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
5e50: 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70  ){.  parseCell(p
5e60: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
5e70: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
5e80: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
5e90: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5ea0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
5eb0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
5ec0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
5ed0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
5ee0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
5ef0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
5f00: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
5f10: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
5f20: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
5f30: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
5f40: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
5f50: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
5f60: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
5f70: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
5f80: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
5f90: 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ze(MemPage *pPag
5fa0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
5fb0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
5fc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
5fd0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
5fe0: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
5ff0: 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a  return info.nSiz
6000: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74  e;.}.#endif.stat
6010: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50  ic u16 cellSizeP
6020: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
6030: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
6040: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
6050: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
6060: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
6070: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
6080: 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e  .  return info.n
6090: 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Size;.}..#ifndef
60a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
60b0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
60c0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
60d0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
60e0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
60f0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
6100: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
6110: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
6120: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
6130: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
6140: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
6150: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
6160: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
6170: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
6180: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
6190: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65  nfo info;.  asse
61a0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
61b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
61c0: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
61d0: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
61e0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f  .  assert( (info
61f0: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
6200: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
6210: 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  y))==info.nPaylo
6220: 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e 66  ad );.  if( (inf
6230: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
6240: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
6250: 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
6260: 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66   ){.    Pgno ovf
6270: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
6280: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
6290: 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ow]);.    return
62a0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
62b0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
62c0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
62d0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
62e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
62f0: 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20  _OK;.}./*.** If 
6300: 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e  the cell with in
6310: 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67  dex iCell on pag
6320: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
6330: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6340: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
6350: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
6360: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
6370: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
6380: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
6390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
63a0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65  ptrmapPutOvfl(Me
63b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
63c0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a  t iCell){.  u8 *
63d0: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
63e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
63f0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6400: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65 6c  mutex) );.  pCel
6410: 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  l = findOverflow
6420: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
6430: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72  l);.  return ptr
6440: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
6450: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23  age, pCell);.}.#
6460: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
6470: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
6480: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
6490: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
64a0: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
64b0: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
64c0: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
64d0: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
64e0: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
64f0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
6500: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
6510: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
6520: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
6530: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6540: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
6550: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
6560: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
6570: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
65a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
65d0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
65e0: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6600: 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62  ffset of first b
6610: 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70  yte after cell p
6620: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
6630: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6650: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
6660: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
6670: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
6680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
6690: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
66a0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
66c0: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
66d0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
66e0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
66f0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
6700: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
6710: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
6720: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
6730: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
6740: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
6750: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6760: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
6770: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
6780: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6790: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
67a0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
67b0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
67c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
67d0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
67e0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
67f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
6800: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
6810: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
6820: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
6830: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
6840: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6850: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
6860: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
6870: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
6880: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
6890: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
68a0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
68b0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
68c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
68d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
68e0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
68f0: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
6900: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
6910: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
6920: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64  Bt->pPager);.  d
6930: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
6940: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
6950: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
6960: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
6970: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
6980: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
6990: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
69a0: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
69b0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
69c0: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
69d0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
69e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b  ableSize;.  cbrk
69f0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6a00: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d  a[hdr+5]);.  mem
6a10: 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c  cpy(&temp[cbrk],
6a20: 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73   &data[cbrk], us
6a30: 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29  ableSize - cbrk)
6a40: 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c  ;.  cbrk = usabl
6a50: 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30  eSize;.  for(i=0
6a60: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
6a70: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
6a80: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
6a90: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
6aa0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
6ab0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
6ac0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
6ad0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
6ae0: 20 20 20 69 66 28 20 70 63 3e 3d 75 73 61 62 6c     if( pc>=usabl
6af0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
6b00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6b10: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
6b20: 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c  .    size = cell
6b30: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
6b40: 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63  temp[pc]);.    c
6b50: 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20  brk -= size;.   
6b60: 20 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c 4f 66   if( cbrk<cellOf
6b70: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c 20  fset+2*nCell || 
6b80: 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69  pc+size>usableSi
6b90: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
6ba0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6bb0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
6bc0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
6bd0: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
6be0: 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a 20 20  && cbrk>=0 );.  
6bf0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
6c00: 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c  brk], &temp[pc],
6c10: 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32   size);.    put2
6c20: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
6c30: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
6c40: 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65   cbrk>=cellOffse
6c50: 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  t+2*nCell );.  p
6c60: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
6c70: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
6c80: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
6c90: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
6ca0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  0;.  data[hdr+7]
6cb0: 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63   = 0;.  addr = c
6cc0: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
6cd0: 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  l;.  memset(&dat
6ce0: 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72 6b  a[addr], 0, cbrk
6cf0: 2d 61 64 64 72 29 3b 0a 20 20 61 73 73 65 72 74  -addr);.  assert
6d00: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
6d10: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
6d20: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
6d30: 66 28 20 63 62 72 6b 2d 61 64 64 72 21 3d 70 50  f( cbrk-addr!=pP
6d40: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
6d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6d60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6d70: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6d80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
6d90: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
6da0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
6db0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
6dc0: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
6dd0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
6de0: 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e  argument. Return
6df0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
6e00: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f  pPage->aData[] o
6e10: 66 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  f the .** first 
6e20: 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65  byte of allocate
6e30: 64 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a 2a 20  d space. .**.** 
6e40: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
6e50: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 20 73  ntees that the s
6e60: 70 61 63 65 20 62 65 74 77 65 65 6e 20 74 68 65  pace between the
6e70: 20 65 6e 64 20 6f 66 20 74 68 65 20 63 65 6c 6c   end of the cell
6e80: 2d 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72 72 61  -offset .** arra
6e90: 79 20 61 6e 64 20 74 68 65 20 73 74 61 72 74 20  y and the start 
6ea0: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
6eb0: 65 6e 74 20 61 72 65 61 20 69 73 20 61 74 20 6c  ent area is at l
6ec0: 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73  east nByte bytes
6ed0: 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53 6f 20  .** in size. So 
6ee0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
6ef0: 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a   never fail..**.
6f00: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6f10: 61 6c 72 65 61 64 79 20 36 30 20 6f 72 20 6d 6f  already 60 or mo
6f20: 72 65 20 62 79 74 65 73 20 6f 66 20 66 72 61 67  re bytes of frag
6f30: 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65  ments within the
6f40: 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20 70 61   page,.** the pa
6f50: 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74  ge is defragment
6f60: 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
6f70: 69 6e 67 2e 20 49 66 20 74 68 69 73 20 77 65 72  ing. If this wer
6f80: 65 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65 72 65  e not done there
6f90: 0a 2a 2a 20 69 73 20 61 20 63 68 61 6e 63 65 20  .** is a chance 
6fa0: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
6fb0: 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  of fragmented by
6fc0: 74 65 73 20 63 6f 75 6c 64 20 65 76 65 6e 74 75  tes could eventu
6fd0: 61 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f  ally .** overflo
6fe0: 77 20 74 68 65 20 73 69 6e 67 6c 65 2d 62 79 74  w the single-byt
6ff0: 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  e field of the p
7000: 61 67 65 2d 68 65 61 64 65 72 20 69 6e 20 77 68  age-header in wh
7010: 69 63 68 20 74 68 69 73 20 76 61 6c 75 65 0a 2a  ich this value.*
7020: 2a 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  * is stored..*/.
7030: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
7040: 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  ateSpace(MemPage
7050: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79   *pPage, int nBy
7060: 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  te){.  const int
7070: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
7080: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
7090: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
70a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
70b0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
70c0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
70d0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
70e0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
70f0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
7100: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
7130: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
7140: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
7150: 74 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73 73 65  t top;.  .  asse
7160: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7170: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
7180: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
7190: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
71a0: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
71b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
71c0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
71d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
71e0: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
71f0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
7200: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
7210: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
7220: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
7230: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7240: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
7250: 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
7260: 74 20 74 68 65 20 73 70 61 63 65 20 62 65 74 77  t the space betw
7270: 65 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66  een the cell-off
7280: 73 65 74 20 61 72 72 61 79 20 61 6e 64 20 74 68  set array and th
7290: 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63 6f 6e  e .  ** cell-con
72a0: 74 65 6e 74 20 61 72 65 61 20 69 73 20 67 72 65  tent area is gre
72b0: 61 74 65 72 20 74 68 61 6e 20 6e 42 79 74 65 20  ater than nByte 
72c0: 62 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  bytes..  */.  as
72d0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 3d 20 28  sert( nByte <= (
72e0: 0a 20 20 20 20 20 20 67 65 74 32 62 79 74 65 28  .      get2byte(
72f0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d 28 68  &data[hdr+5])-(h
7300: 64 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c 65 61  dr+8+(pPage->lea
7310: 66 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62 79 74  f?0:4)+2*get2byt
7320: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 29  e(&data[hdr+3]))
7330: 0a 20 20 29 29 3b 0a 0a 20 20 70 50 61 67 65 2d  .  ));..  pPage-
7340: 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 6e  >nFree -= (u16)n
7350: 42 79 74 65 3b 0a 20 20 6e 46 72 61 67 20 3d 20  Byte;.  nFrag = 
7360: 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69  data[hdr+7];.  i
7370: 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a  f( nFrag>=60 ){.
7380: 20 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61      defragmentPa
7390: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c  ge(pPage);.  }el
73a0: 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  se{.    /* Searc
73b0: 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c  h the freelist l
73c0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
73d0: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
73e0: 68 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20  h to satisfy .  
73f0: 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
7400: 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  . The allocation
7410: 20 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68   is made from th
7420: 65 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f  e first free slo
7430: 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  t in .    ** the
7440: 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61   list that is la
7450: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63  rge enough to ac
7460: 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20  comadate it..   
7470: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20   */.    int pc, 
7480: 61 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64  addr;.    for(ad
7490: 64 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20  dr=hdr+1; (pc = 
74a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
74b0: 64 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70  ddr]))>0; addr=p
74c0: 63 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  c){.      int si
74d0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
74e0: 61 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20  ata[pc+2]);     
74f0: 2f 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20  /* Size of free 
7500: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  slot */.      if
7510: 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b  ( size>=nByte ){
7520: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
7530: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
7540: 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29         if( x<4 )
7550: 7b 0a 09 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  {..  /* Remove t
7560: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
7570: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
7580: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
7590: 0a 09 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65  ..  ** fragmente
75a0: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
75b0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
75c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
75d0: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
75e0: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
75f0: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
7600: 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29   (u8)(nFrag + x)
7610: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7620: 0a 09 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20  ..  /* The slot 
7630: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
7640: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
7650: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
7660: 6f 75 6e 74 0a 09 20 20 2a 2a 20 66 6f 72 20 74  ount..  ** for t
7670: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
7680: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
7690: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
76a0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
76b0: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
76c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
76d0: 72 65 74 75 72 6e 20 70 63 20 2b 20 78 3b 0a 20  return pc + x;. 
76e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
76f0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7700: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
7710: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
7720: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
7730: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
7740: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
7750: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
7760: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7770: 61 5b 68 64 72 2b 35 5d 29 20 2d 20 6e 42 79 74  a[hdr+5]) - nByt
7780: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
7790: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
77a0: 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a  ;.  return top;.
77b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
77c0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
77d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
77e0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
77f0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
7800: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
7810: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
7820: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
7830: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
7840: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
7850: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
7860: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
7870: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
7880: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
7890: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
78a0: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
78b0: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
78c0: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
78d0: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
78e0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
78f0: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
7900: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
7910: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
7920: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7930: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
7940: 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
7950: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
7960: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7970: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
7980: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
7990: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
79a0: 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68   start>=pPage->h
79b0: 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67  drOffset+6+(pPag
79c0: 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a  e->leaf?0:4) );.
79d0: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
79e0: 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d   + size)<=pPage-
79f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
7a00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
7a10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7a20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
7a30: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
7a40: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
7a50: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
7a60: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64  ze is 4 */..#ifd
7a70: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
7a80: 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65  _DELETE.  /* Ove
7a90: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
7aa0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
7ab0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53  zeros when the S
7ac0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20  ECURE_DELETE .  
7ad0: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
7ae0: 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
7af0: 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  time */.  memset
7b00: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
7b10: 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  , size);.#endif.
7b20: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
7b30: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
7b40: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
7b50: 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20   freeblocks */. 
7b60: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
7b70: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
7b80: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
7b90: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
7ba0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
7bb0: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
7bc0: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  egin>0 ){.    as
7bd0: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
7be0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
7bf0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69 66  Size-4 );.    if
7c00: 28 20 70 62 65 67 69 6e 3c 3d 61 64 64 72 20 29  ( pbegin<=addr )
7c10: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
7c20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7c30: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
7c40: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
7c50: 7d 0a 20 20 69 66 20 28 20 70 62 65 67 69 6e 3e  }.  if ( pbegin>
7c60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7c70: 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a 20 20 20  leSize-4 ) {.   
7c80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7c90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
7ca0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
7cb0: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
7cc0: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
7cd0: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
7ce0: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
7cf0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
7d00: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
7d10: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
7d20: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
7d30: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 28 75 31  ge->nFree += (u1
7d40: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
7d50: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
7d60: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
7d70: 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68   addr = pPage->h
7d80: 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20  drOffset + 1;.  
7d90: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
7da0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7db0: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
7dc0: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
7dd0: 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74  e, x;.    assert
7de0: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
7df0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
7e00: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
7e10: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
7e20: 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74  .    pnext = get
7e30: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
7e40: 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20  in]);.    psize 
7e50: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
7e60: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
7e70: 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73   if( pbegin + ps
7e80: 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74  ize + 3 >= pnext
7e90: 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20   && pnext>0 ){. 
7ea0: 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20       int frag = 
7eb0: 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b  pnext - (pbegin+
7ec0: 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  psize);.      if
7ed0: 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66  ( (frag<0) || (f
7ee0: 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 70 50  rag>(int)data[pP
7ef0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
7f00: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
7f10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7f20: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
7f30: 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61  }.      data[pPa
7f40: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
7f50: 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20   -= (u8)frag;.  
7f60: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
7f70: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a  (&data[pnext]);.
7f80: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
7f90: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29  data[pbegin], x)
7fa0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78  ;.      x = pnex
7fb0: 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  t + get2byte(&da
7fc0: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70  ta[pnext+2]) - p
7fd0: 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74  begin;.      put
7fe0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
7ff0: 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d  in+2], x);.    }
8000: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
8010: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
8020: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8030: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8040: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
8050: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
8060: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
8070: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
8080: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
8090: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
80a0: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
80b0: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
80c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
80d0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
80e0: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
80f0: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
8100: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
8110: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8120: 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79  hdr+5]) + get2by
8130: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
8140: 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  2]);.    put2byt
8150: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
8160: 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  top);.  }.  asse
8170: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8180: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8190: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
81a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
81b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
81c0: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
81d0: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
81e0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
81f0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
8200: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
8210: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
8220: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
8230: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
8240: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
8250: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
8260: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
8270: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
8280: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
8290: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
82a0: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
82b0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
82c0: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
82d0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
82e0: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
82f0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
8300: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
8310: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
8320: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
8330: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
8340: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
8350: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
8360: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
8370: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
8380: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
8390: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
83a0: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
83b0: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
83c0: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
83d0: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
83e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
83f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8400: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8410: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
8420: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
8430: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
8440: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
8450: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
8460: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
8470: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
8480: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
8490: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
84a0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
84b0: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
84c0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
84d0: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
84e0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
84f0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
8500: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
8510: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
8520: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
8530: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
8540: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
8550: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
8560: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
8570: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
8580: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
8590: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
85a0: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a  e->hasData = 0;.
85b0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
85c0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
85d0: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
85e0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
85f0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
8600: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
8610: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8620: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
8630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8640: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
8650: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
8660: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
8670: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
8680: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
8690: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
86a0: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
86b0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
86c0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
86d0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
86e0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
86f0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
8700: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
8710: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
8720: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
8730: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
8740: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
8750: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
8760: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
8770: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
8780: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
8790: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uption..*/.int s
87a0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
87b0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
87c0: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
87d0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
87e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
87f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8800: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8810: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8820: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
8830: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
8840: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
8850: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8860: 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
8870: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
8880: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
8890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
88a0: 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
88b0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
88c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
88d0: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
88e0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31  isInit ){.    u1
88f0: 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  6 pc;           
8900: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8910: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
8920: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
8930: 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20   */.    u8 hdr; 
8940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8950: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
8960: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
8970: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61   */.    u8 *data
8980: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
8990: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
89a0: 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61  ata */.    BtSha
89b0: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
89c0: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
89d0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
89e0: 20 20 20 20 75 31 36 20 75 73 61 62 6c 65 53 69      u16 usableSi
89f0: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
8a00: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
8a10: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
8a20: 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  .    u16 cellOff
8a30: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
8a40: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
8a50: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
8a60: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
8a70: 20 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20    u16 nFree;    
8a80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8a90: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
8aa0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
8ab0: 20 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20    u16 top;      
8ac0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
8ad0: 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
8ae0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a  ontent area */..
8af0: 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d      pBt = pPage-
8b00: 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d  >pBt;..    hdr =
8b10: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8b20: 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  t;.    data = pP
8b30: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
8b40: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
8b50: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
8b60: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
8b70: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8b80: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
8b90: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
8ba0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
8bb0: 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50  =32768 );.    pP
8bc0: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
8bd0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
8be0: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  1;.    pPage->nO
8bf0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
8c00: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
8c10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
8c20: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
8c30: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
8c40: 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
8c50: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
8c60: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
8c70: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
8c80: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
8c90: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8ca0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
8cb0: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
8cc0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
8cd0: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
8ce0: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
8cf0: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
8d00: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
8d10: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
8d20: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8d30: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
8d40: 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65   .    /* Compute
8d50: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
8d60: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
8d70: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
8d80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8d90: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
8da0: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
8db0: 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65  top - (cellOffse
8dc0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
8dd0: 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ll);.    while( 
8de0: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
8df0: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
8e00: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
8e10: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
8e20: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
8e30: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
8e40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
8e50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8e60: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
8e70: 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
8e80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
8e90: 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  );.      size = 
8ea0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
8eb0: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
8ec0: 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c   next>0 && next<
8ed0: 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20  =pc+size+3 ){.  
8ee0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
8ef0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
8f00: 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
8f10: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
8f20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
8f30: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
8f40: 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73        nFree += s
8f50: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
8f60: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  next;.    }.    
8f70: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
8f80: 75 31 36 29 6e 46 72 65 65 3b 0a 20 20 20 20 69  u16)nFree;.    i
8f90: 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65  f( nFree>=usable
8fa0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
8fb0: 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e   Free space cann
8fc0: 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20  ot exceed total 
8fd0: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  page size */.   
8fe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8ff0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
9000: 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f      }..#if 0.  /
9010: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c 6c  * Check that all
9020: 20 74 68 65 20 6f 66 66 73 65 74 73 20 69 6e 20   the offsets in 
9030: 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74 20  the cell offset 
9040: 61 72 72 61 79 20 61 72 65 20 77 69 74 68 69 6e  array are within
9050: 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20   range. .  ** . 
9060: 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74 68 69   ** Omitting thi
9070: 73 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63 68  s consistency ch
9080: 65 63 6b 20 61 6e 64 20 75 73 69 6e 67 20 74 68  eck and using th
9090: 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  e pPage->maskPag
90a0: 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70  e mask.  ** to p
90b0: 72 65 76 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69  revent overrunni
90c0: 6e 67 20 74 68 65 20 70 61 67 65 20 62 75 66 66  ng the page buff
90d0: 65 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29  er in findCell()
90e0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 0a 20 20   results in a.  
90f0: 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f 72 6d 61  ** 2.5% performa
9100: 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  nce gain..  */. 
9110: 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66 66 3b   {.    u8 *pOff;
9120: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
9130: 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68 65 63  tor used to chec
9140: 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65  k all cell offse
9150: 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67 65 20  ts are in range 
9160: 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b  */.    u8 *pEnd;
9170: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9180: 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c  er to end of cel
9190: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 2a  l offset array *
91a0: 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b 20 20  /.    u8 mask;  
91b0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
91c0: 66 20 62 69 74 73 20 74 68 61 74 20 6d 75 73 74  f bits that must
91d0: 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20   be zero in MSB 
91e0: 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  of cell offsets 
91f0: 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28  */.    mask = ~(
9200: 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53  ((u8)(pBt->pageS
9210: 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20  ize>>8))-1);.   
9220: 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65   pEnd = &data[ce
9230: 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67 65  llOffset + pPage
9240: 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20  ->nCell*2];.    
9250: 66 6f 72 28 70 4f 66 66 3d 26 64 61 74 61 5b 63  for(pOff=&data[c
9260: 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66  ellOffset]; pOff
9270: 21 3d 70 45 6e 64 20 26 26 20 21 28 28 2a 70 4f  !=pEnd && !((*pO
9280: 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b  ff)&mask); pOff+
9290: 3d 32 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 66  =2);.    if( pOf
92a0: 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f!=pEnd ){.     
92b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
92c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
92d0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
92e0: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
92f0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
9300: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9310: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
9320: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
9330: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
9340: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
9350: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
9360: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
9370: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
9380: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9390: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
93a0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
93b0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
93c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
93d0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
93e0: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
93f0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
9400: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
9410: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
9420: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
9430: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
9440: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
9450: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9460: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
9470: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
9480: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
9490: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
94a0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
94b0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
94c0: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
94d0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
94e0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
94f0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
9500: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9510: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
9520: 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74  x) );.  /*memset
9530: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
9540: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
9550: 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61  - hdr);*/.  data
9560: 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
9570: 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
9580: 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61  dr + 8 + 4*((fla
9590: 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
95a0: 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ?1:0);.  memset(
95b0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
95c0: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
95d0: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
95e0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
95f0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
9600: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
9610: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
9620: 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64  ize - first;.  d
9630: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
9640: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
9650: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
9660: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
9670: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
9680: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
9690: 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
96a0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
96b0: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
96c0: 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b  geSize<=32768 );
96d0: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
96e0: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
96f0: 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d  ze - 1;.  pPage-
9700: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
9710: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
9720: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
9730: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
9740: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
9750: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
9760: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
9770: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
9780: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
9790: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
97a0: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
97b0: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
97c0: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
97d0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
97e0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
97f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
9800: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
9810: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
9820: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
9830: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
9840: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
9850: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
9860: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
9870: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
9880: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
9890: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
98a0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
98b0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
98c0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
98d0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
98e0: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
98f0: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
9900: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
9910: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
9920: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
9930: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
9940: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
9950: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
9960: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
9970: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
9980: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
9990: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
99a0: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
99b0: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
99c0: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
99d0: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
99e0: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
99f0: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
9a00: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
9a10: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
9a20: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
9a30: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
9a40: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
9a50: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
9a60: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
9a70: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
9a80: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
9a90: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
9aa0: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   point..*/.int s
9ab0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
9ac0: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
9ad0: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
9ae0: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
9af0: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
9b00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
9b10: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
9b20: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
9b30: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
9b40: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
9b50: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
9b60: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
9b70: 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  nt        /* Do 
9b80: 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f  not load page co
9b90: 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f  ntent if true */
9ba0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
9bb0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
9bc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9bd0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9be0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9bf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9c00: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
9c10: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
9c20: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
9c30: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
9c40: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
9c50: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
9c60: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
9c70: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
9c80: 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
9c90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9ca0: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
9cb0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
9cc0: 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
9cd0: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
9ce0: 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
9cf0: 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
9d00: 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
9d10: 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
9d20: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
9d30: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
9d40: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
9d50: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
9d60: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
9d70: 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
9d80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
9d90: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
9da0: 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
9db0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9dc0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
9dd0: 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
9de0: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
9df0: 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
9e00: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
9e10: 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
9e20: 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
9e30: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
9e40: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
9e50: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
9e60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
9e70: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
9e80: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
9e90: 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
9ea0: 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
9eb0: 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
9ec0: 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
9ed0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
9ee0: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42 74  agerPagecount(Bt
9ef0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
9f00: 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a  int nPage = -1;.
9f10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
9f20: 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
9f30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
9f40: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
9f50: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
9f60: 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
9f70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
9f80: 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20 20   nPage==-1 );.  
9f90: 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50 61  return (Pgno)nPa
9fa0: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ge;.}../*.** Get
9fb0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
9fc0: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
9fd0: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
9fe0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
9ff0: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
a000: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
a010: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
a020: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
a030: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73  eGetPage() and s
a040: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
a050: 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
a060: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
a070: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
a080: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
a090: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
a0a0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
a0b0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
a0c0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
a0d0: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
a0e0: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
a0f0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
a100: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
a110: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
a120: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
a130: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
a140: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a150: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
a160: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
a170: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a180: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a190: 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PT; .  }..  /* I
a1a0: 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63  t is often the c
a1b0: 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ase that the pag
a1c0: 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72  e we want is alr
a1d0: 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20  eady in cache.. 
a1e0: 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69   ** If so, get i
a1f0: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
a200: 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20  s saves us from 
a210: 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20  having to call. 
a220: 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75   ** pagerPagecou
a230: 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72  nt() to make sur
a240: 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e  e pgno is within
a250: 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72   limits, which r
a260: 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61  esults.  ** in a
a270: 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65 72   measureable per
a280: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
a290: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70  ments..  */.  *p
a2a0: 70 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20  pPage = pPage = 
a2b0: 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
a2c0: 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  pBt, pgno);.  if
a2d0: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  ( pPage ){.    /
a2e0: 2a 20 50 61 67 65 20 69 73 20 61 6c 72 65 61 64  * Page is alread
a2f0: 79 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  y in cache */.  
a300: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
a310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
a320: 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61  * Page not in ca
a330: 63 68 65 2e 20 20 41 63 71 75 69 72 65 20 69 74  che.  Acquire it
a340: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
a350: 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
a360: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
a370: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a380: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
a390: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
a3a0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
a3b0: 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
a3c0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
a3d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a3e0: 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67    pPage = *ppPag
a3f0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  e;.  }.  if( !pP
a400: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
a410: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
a420: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
a430: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
a440: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a450: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
a460: 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50  pPage);.    *ppP
a470: 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
a480: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a490: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
a4a0: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
a4b0: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
a4c0: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
a4d0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
a4e0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e  te3BtreeGetPage.
a4f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a500: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
a510: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
a520: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
a530: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
a540: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73  Overflow==0 || s
a550: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
a560: 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  efcount(pPage->p
a570: 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20 20  DbPage)>1 );.   
a580: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a590: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
a5a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
a5b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
a5c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
a5d0: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
a5e0: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
a5f0: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
a600: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
a610: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
a620: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
a630: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
a640: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a650: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a660: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
a670: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
a680: 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
a690: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
a6a0: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
a6b0: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
a6c0: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
a6d0: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
a6e0: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
a6f0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
a700: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
a710: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
a720: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
a730: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
a740: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
a750: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
a760: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
a770: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a780: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
a790: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
a7a0: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
a7b0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
a7c0: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
a7d0: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
a7e0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
a7f0: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
a800: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
a810: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
a820: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
a830: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
a840: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
a850: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a860: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
a870: 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
a880: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
a890: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
a8a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a8b0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a8c0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
a8d0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
a8e0: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
a8f0: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
a900: 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
a910: 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
a920: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
a930: 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
a940: 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
a950: 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
a960: 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
a970: 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
a980: 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
a990: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
a9a0: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
a9b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
a9c0: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
a9d0: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
a9e0: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
a9f0: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
aa00: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
aa10: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
aa20: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
aa30: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
aa40: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
aa50: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
aa60: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
aa70: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
aa80: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
aa90: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
aaa0: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
aab0: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
aac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
aad0: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
aae0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
aaf0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
ab00: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
ab10: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
ab20: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
ab30: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
ab40: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
ab50: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
ab60: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
ab70: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
ab80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ab90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
aba0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
abb0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
abc0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
abd0: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
abe0: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
abf0: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
ac00: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
ac10: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
ac20: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
ac30: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
ac40: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
ac50: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
ac60: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
ac70: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
ac80: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
ac90: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
aca0: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
acb0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
acc0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
acd0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
ace0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
acf0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
ad00: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
ad10: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
ad20: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
ad30: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
ad40: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
ad50: 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
ad60: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
ad70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
ad80: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
ad90: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
ada0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
adb0: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
adc0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
add0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
ade0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
adf0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
ae00: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
ae10: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
ae20: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
ae30: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
ae40: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae60: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
ae70: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
ae80: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
ae90: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
aea0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
aeb0: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  n() */.){.  sqli
aec0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
aed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
aee0: 65 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  e VFS to use for
aef0: 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20   this btree */. 
af00: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
af10: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
af20: 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
af30: 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
af40: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af60: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
af70: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
af80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
af90: 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
afa0: 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
afb0: 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
afc0: 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
afd0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
afe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
aff0: 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
b000: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
b010: 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
b040: 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
b050: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
b060: 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
b070: 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
b080: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
b090: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
b0a0: 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
b0b0: 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
b0c0: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
b0d0: 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
b0e0: 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
b0f0: 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
b100: 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f  base. This symbo
b110: 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  l is only requir
b120: 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65  ed if.  ** eithe
b130: 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d  r of the shared-
b140: 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75  data or autovacu
b150: 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20  um features are 
b160: 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69  compiled .  ** i
b170: 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e  nto the library.
b180: 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
b190: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b1a0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20  HARED_CACHE) || 
b1b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b1c0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29  OMIT_AUTOVACUUM)
b1d0: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
b1e0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
b1f0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
b200: 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73  emdb = 0;.  #els
b210: 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  e.    const int 
b220: 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e  isMemdb = zFilen
b230: 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a  ame && !strcmp(z
b240: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
b250: 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a  ry:");.  #endif.
b260: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
b270: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
b280: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b290: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
b2a0: 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20  x) );..  pVfs = 
b2b0: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20  db->pVfs;.  p = 
b2c0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
b2d0: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
b2e0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
b2f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b300: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
b310: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
b320: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
b330: 64 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  db;..#if !define
b340: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
b350: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
b360: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b370: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
b380: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
b390: 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
b3a0: 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
b3b0: 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
b3c0: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
b3d0: 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
b3e0: 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
b3f0: 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
b400: 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26  if( isMemdb==0 &
b410: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  & zFilename && z
b420: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
b430: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
b440: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
b450: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b  dCacheEnabled ){
b460: 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c  .      int nFull
b470: 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
b480: 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
b490: 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c       char *zFull
b4a0: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
b4b0: 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61  e3Malloc(nFullPa
b4c0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  thname);.      s
b4d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
b4e0: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
b4f0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
b500: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
b510: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72  s |= SQLITE_Shar
b520: 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69  edCache;.      i
b530: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
b540: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
b550: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
b560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b570: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
b580: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b590: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
b5a0: 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
b5b0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
b5c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
b5d0: 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d       mutexOpen =
b5e0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
b5f0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
b600: 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20  STATIC_OPEN);.  
b610: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
b620: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65  x_enter(mutexOpe
b630: 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  n);.      mutexS
b640: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
b650: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
b660: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
b670: 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
b680: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b690: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
b6a0: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
b6b0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
b6c0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
b6d0: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
b6e0: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
b6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
b700: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
b710: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
b720: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
b730: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
b740: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
b750: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
b760: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
b770: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
b780: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
b790: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
b7a0: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
b7b0: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
b7c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b7d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b7e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
b7f0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
b800: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
b810: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
b820: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
b830: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
b840: 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
b850: 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
b860: 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
b870: 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
b880: 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
b890: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
b8a0: 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
b8b0: 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
b8c0: 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
b8d0: 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
b8e0: 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
b8f0: 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
b900: 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
b910: 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
b920: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
b930: 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
b940: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
b950: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
b960: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
b970: 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
b980: 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
b990: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
b9a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
b9b0: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
b9c0: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
b9d0: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
b9e0: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
b9f0: 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
ba00: 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
ba10: 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
ba20: 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
ba30: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
ba40: 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
ba50: 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
ba60: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
ba70: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
ba80: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
ba90: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
baa0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
bab0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
bac0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
bad0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
bae0: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
baf0: 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
bb00: 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
bb10: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
bb20: 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
bb30: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
bb40: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
bb50: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
bb60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
bb70: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
bb80: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
bb90: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
bba0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
bbb0: 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
bbc0: 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
bbd0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20      EXTRA_SIZE, 
bc00: 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29  flags, vfsFlags)
bc10: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
bc20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bc30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
bc40: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
bc50: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
bc60: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
bc70: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
bc80: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
bc90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
bca0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
bcb0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  out;.    }.    s
bcc0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
bcd0: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
bce0: 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
bcf0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
bd00: 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
bd10: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71  = pBt;.  .    sq
bd20: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
bd30: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
bd40: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
bd50: 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
bd60: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
bd70: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
bd80: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
bd90: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
bda0: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
bdb0: 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  r);.    pBt->pag
bdc0: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
bdd0: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
bde0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
bdf0: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
be00: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
be10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
be20: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
be30: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
be40: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
be50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
be60: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20  >pageSize = 0;. 
be70: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
be80: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
be90: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
bea0: 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e 64  pageSize);.#ifnd
beb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
bec0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
bed0: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
bee0: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
bef0: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
bf00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
bf10: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
bf20: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
bf30: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
bf40: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
bf50: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
bf60: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
bf70: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
bf80: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
bf90: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
bfa0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
bfb0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
bfc0: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
bfd0: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
bfe0: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
bff0: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
c000: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
c010: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
c020: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
c030: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
c040: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
c050: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
c060: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
c070: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
c080: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
c090: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
c0a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
c0b0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
c0c0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
c0d0: 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
c0e0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
c0f0: 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
c100: 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
c110: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
c120: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
c130: 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
c140: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
c150: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
c160: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
c170: 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
c180: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
c190: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
c1a0: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
c1b0: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
c1c0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
c1d0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
c1e0: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
c1f0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
c200: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
c210: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c220: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
c230: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
c240: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
c250: 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
c260: 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
c270: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
c280: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
c290: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
c2a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
c2b0: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
c2c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
c2d0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
c2e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c2f0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
c300: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
c310: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
c320: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
c330: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
c340: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
c350: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
c360: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
c370: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
c380: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
c390: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
c3a0: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
c3b0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
c3c0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
c3d0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
c3e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
c3f0: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
c400: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
c410: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
c420: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
c430: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
c440: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
c450: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
c460: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
c470: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
c480: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
c490: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
c4a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
c4b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
c4c0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
c4d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c4e0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
c4f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
c500: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
c510: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
c520: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
c530: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
c540: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
c550: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
c560: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
c570: 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
c580: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
c590: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
c5a0: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
c5b0: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
c5c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c5d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
c5e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
c5f0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
c600: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
c610: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
c620: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
c630: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
c640: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
c650: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
c660: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
c670: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
c680: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
c690: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
c6a0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
c6b0: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
c6c0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
c6d0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
c6e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
c6f0: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
c700: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
c710: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
c720: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
c730: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
c740: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
c750: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
c760: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
c770: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
c780: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
c790: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
c7a0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
c7b0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
c7c0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
c7d0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
c7e0: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
c7f0: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
c800: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
c810: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
c820: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
c830: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
c840: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
c850: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
c860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c870: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
c880: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
c890: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
c8a0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
c8b0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
c8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
c8d0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
c8e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c8f0: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
c900: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
c910: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
c920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c930: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
c940: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
c950: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
c960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c970: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
c980: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
c990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
c9a0: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
c9b0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
c9c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
c9d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
c9e0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
c9f0: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
ca00: 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
ca10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
ca20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ca30: 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
ca40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ca50: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
ca60: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ca70: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
ca80: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
ca90: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
caa0: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
cab0: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
cac0: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
cad0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
cae0: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
caf0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
cb00: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
cb10: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
cb20: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
cb30: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
cb40: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
cb50: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
cb60: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
cb70: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
cb80: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
cb90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cba0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
cbb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
cbc0: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
cbd0: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
cbe0: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
cbf0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cc00: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
cc10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
cc20: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
cc30: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
cc40: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
cc50: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
cc60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
cc70: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
cc80: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
cc90: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
cca0: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
ccb0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
ccc0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
ccd0: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
cce0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
ccf0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
cd00: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
cd10: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
cd20: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
cd30: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
cd40: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
cd50: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
cd60: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
cd70: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
cd80: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
cd90: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
cda0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
cdb0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
cdc0: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
cdd0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
cde0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
cdf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
ce00: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
ce10: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
ce20: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
ce30: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
ce40: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
ce50: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
ce60: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
ce70: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
ce80: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
ce90: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
cea0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
ceb0: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
cec0: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
ced0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
cee0: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
cef0: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
cf00: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
cf10: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
cf20: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
cf30: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
cf40: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
cf50: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
cf60: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
cf70: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
cf80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
cf90: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
cfa0: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
cfb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
cfc0: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
cfd0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
cfe0: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
cff0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
d000: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
d010: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
d020: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
d030: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
d040: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
d050: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d060: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
d070: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
d080: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
d090: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
d0a0: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
d0b0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
d0c0: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
d0d0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d0e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d0f0: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
d100: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
d110: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
d120: 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
d130: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
d140: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
d150: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
d160: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
d170: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
d180: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
d190: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
d1a0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
d1b0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
d1c0: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
d1d0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
d1e0: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
d1f0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
d200: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
d210: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
d220: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
d230: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
d240: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
d250: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
d260: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
d270: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
d280: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
d290: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
d2a0: 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
d2b0: 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
d2c0: 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
d2d0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
d2e0: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
d2f0: 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
d300: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
d310: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
d320: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
d330: 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
d340: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
d350: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d360: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
d370: 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
d380: 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
d390: 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
d3a0: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
d3b0: 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
d3c0: 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
d3d0: 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
d3e0: 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
d3f0: 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
d400: 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
d410: 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
d420: 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
d430: 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
d440: 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
d450: 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
d460: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
d470: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
d480: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
d490: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
d4a0: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
d4b0: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
d4c0: 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
d4d0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
d4e0: 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
d4f0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
d500: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d510: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
d520: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
d530: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
d540: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
d550: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d560: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
d570: 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
d580: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
d590: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
d5a0: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
d5b0: 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
d5c0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
d5d0: 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
d5e0: 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
d5f0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
d600: 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
d610: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
d620: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d630: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
d640: 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
d650: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
d660: 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
d670: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
d680: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
d690: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
d6a0: 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
d6b0: 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
d6c0: 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
d6d0: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
d6e0: 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
d6f0: 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
d700: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
d710: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
d720: 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
d730: 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
d740: 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
d750: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
d760: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
d770: 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
d780: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
d790: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
d7a0: 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
d7b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
d7c0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
d7d0: 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
d7e0: 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
d7f0: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
d800: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
d810: 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
d820: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
d830: 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
d840: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
d850: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
d860: 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
d870: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
d880: 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
d890: 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
d8a0: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
d8b0: 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
d8c0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
d8d0: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
d8e0: 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
d8f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
d900: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
d910: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
d920: 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
d930: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
d940: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d950: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
d960: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
d970: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
d980: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
d990: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
d9a0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
d9b0: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
d9c0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
d9d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d9e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
d9f0: 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
da00: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
da10: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
da20: 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
da30: 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
da40: 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
da50: 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
da60: 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
da70: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
da80: 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
da90: 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
daa0: 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
dab0: 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
dac0: 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
dad0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
dae0: 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
daf0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
db00: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
db10: 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
db20: 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
db30: 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
db40: 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
db50: 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
db60: 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
db70: 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
db80: 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
db90: 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
dba0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
dbb0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
dbc0: 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
dbd0: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
dbe0: 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
dbf0: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
dc00: 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
dc10: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
dc20: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
dc30: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
dc40: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
dc50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
dc60: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
dc70: 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
dc80: 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
dc90: 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e  , level, fullSyn
dca0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
dcb0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
dcc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dcd0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
dce0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
dcf0: 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
dd00: 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
dd10: 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
dd20: 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
dd30: 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
dd40: 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
dd50: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
dd60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
dd70: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
dd80: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
dd90: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
dda0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
ddb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ddc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
ddd0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
dde0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ddf0: 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
de00: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
de10: 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
de20: 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
de30: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
de40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
de50: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
de60: 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
de70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
de80: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
de90: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
dea0: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
deb0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
dec0: 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
ded0: 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
dee0: 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
def0: 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
df00: 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
df10: 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
df20: 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
df30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
df40: 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
df50: 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
df60: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
df70: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
df80: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
df90: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
dfa0: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
dfb0: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
dfc0: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
dfd0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
dfe0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
dff0: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
e000: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
e010: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
e020: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
e030: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
e040: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
e050: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
e060: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
e070: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
e080: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
e090: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
e0a0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
e0b0: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
e0c0: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
e0d0: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
e0e0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
e0f0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
e100: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
e110: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
e120: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
e130: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
e140: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
e150: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
e160: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
e170: 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
e180: 20 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78   the pageSizeFix
e190: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ed flag is set s
e1a0: 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
e1b0: 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
e1c0: 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
e1d0: 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
e1e0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
e1f0: 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
e200: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
e210: 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
e220: 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
e230: 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
e240: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
e250: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
e260: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
e270: 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
e280: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
e290: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
e2a0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
e2b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
e2c0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
e2d0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
e2e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e2f0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
e300: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
e310: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
e320: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
e330: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
e340: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
e350: 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
e360: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
e370: 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
e380: 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
e390: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
e3a0: 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
e3b0: 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
e3c0: 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
e3d0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
e3e0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
e3f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
e400: 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
e410: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
e420: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
e430: 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
e440: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
e450: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  ce(pBt);.    rc 
e460: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
e470: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
e480: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
e490: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
e4a0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
e4b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
e4c0: 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
e4d0: 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
e4e0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
e4f0: 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   1;.  sqlite3Btr
e500: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
e510: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e520: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
e530: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
e540: 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
e550: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
e560: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
e570: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
e580: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
e590: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
e5a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
e5b0: 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
e5c0: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
e5d0: 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
e5e0: 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
e5f0: 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
e600: 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
e610: 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
e620: 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
e630: 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
e640: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
e650: 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
e660: 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
e670: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
e680: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
e690: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
e6a0: 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
e6b0: 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
e6c0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
e6d0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
e6e0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
e6f0: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
e700: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
e710: 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
e720: 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
e730: 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
e740: 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
e750: 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
e760: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
e770: 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
e780: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
e790: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
e7a0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e7b0: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
e7c0: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
e7d0: 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
e7e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e7f0: 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
e800: 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
e810: 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
e820: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
e830: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
e840: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
e850: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
e860: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e870: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
e880: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
e890: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
e8a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
e8b0: 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
e8c0: 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
e8d0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
e8e0: 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
e8f0: 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
e900: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
e910: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
e920: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
e930: 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
e940: 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
e950: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
e960: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
e970: 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
e980: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
e990: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
e9a0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
e9b0: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
e9c0: 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
e9d0: 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
e9e0: 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
e9f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
ea00: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
ea10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
ea20: 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
ea30: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
ea40: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
ea50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
ea60: 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
ea70: 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
ea80: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
ea90: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
eaa0: 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20  izeFixed && (av 
eab0: 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
eac0: 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
ead0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
eae0: 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
eaf0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
eb00: 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
eb10: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
eb20: 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
eb30: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
eb40: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
eb50: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
eb60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
eb70: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
eb80: 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
eb90: 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
eba0: 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
ebb0: 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
ebc0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
ebd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
ebe0: 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
ebf0: 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
ec00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ec10: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
ec20: 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
ec30: 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
ec40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
ec50: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
ec60: 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
ec70: 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
ec80: 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
ec90: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
eca0: 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
ecb0: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
ecc0: 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
ecd0: 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
ece0: 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
ecf0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
ed00: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
ed10: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
ed20: 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
ed30: 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
ed40: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ed50: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
ed60: 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
ed70: 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
ed80: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
ed90: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
eda0: 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
edb0: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
edc0: 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
edd0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
ede0: 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
edf0: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
ee00: 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
ee10: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
ee20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
ee30: 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
ee40: 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
ee50: 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
ee60: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
ee70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
ee80: 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
ee90: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
eea0: 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
eeb0: 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67  age1;.  int nPag
eec0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
eed0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
eee0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
eef0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
ef00: 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
ef10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
ef20: 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
ef30: 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
ef40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ef50: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
ef60: 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
ef70: 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
ef80: 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
ef90: 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
efa0: 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
efb0: 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
efc0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
efd0: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
efe0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
eff0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
f000: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f010: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
f020: 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20  failed;.  }else 
f030: 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
f040: 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b     int pageSize;
f050: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
f060: 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
f070: 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
f080: 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
f090: 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
f0a0: 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
f0b0: 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
f0c0: 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
f0d0: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
f0e0: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
f0f0: 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
f100: 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
f110: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
f120: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
f130: 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
f140: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
f150: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
f160: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
f170: 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  um embedded frac
f180: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61  tion must be exa
f190: 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74  ctly 25%.  And t
f1a0: 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  he minimum.    *
f1b0: 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  * embedded fract
f1c0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35  ion must be 12.5
f1d0: 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d  % for both leaf-
f1e0: 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61  data and non-lea
f1f0: 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54  f-data..    ** T
f200: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
f210: 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
f220: 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
f230: 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
f240: 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
f250: 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
f260: 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
f270: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
f280: 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
f290: 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
f2a0: 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
f2b0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
f2c0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
f2d0: 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
f2e0: 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
f2f0: 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
f300: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
f310: 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65  )!=0 || pageSize
f320: 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20  <512 ||.        
f330: 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  (SQLITE_MAX_PAGE
f340: 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70  _SIZE<32768 && p
f350: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
f360: 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20  AX_PAGE_SIZE).  
f370: 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
f380: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
f390: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
f3a0: 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
f3b0: 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73   7)==0 );.    us
f3c0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
f3d0: 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
f3e0: 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a  .    if( pageSiz
f3f0: 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
f400: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
f410: 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
f420: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
f430: 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
f440: 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
f450: 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
f460: 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
f470: 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
f480: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
f490: 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
f4a0: 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
f4b0: 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
f4c0: 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
f4d0: 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
f4e0: 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
f4f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
f500: 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
f510: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
f520: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
f530: 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
f540: 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
f550: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
f560: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
f570: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
f580: 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
f590: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
f5a0: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
f5b0: 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
f5c0: 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
f5d0: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
f5e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
f5f0: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
f600: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
f610: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
f620: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f630: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61     }.    if( usa
f640: 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20  bleSize<500 ){. 
f650: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
f660: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
f670: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
f680: 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65  Size = (u16)page
f690: 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
f6a0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36  sableSize = (u16
f6b0: 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66  )usableSize;.#if
f6c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f6d0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
f6e0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
f6f0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
f700: 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
f710: 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
f720: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
f730: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
f740: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
f750: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
f760: 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
f770: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
f780: 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
f790: 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
f7a0: 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
f7b0: 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
f7c0: 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
f7d0: 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
f7e0: 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
f7f0: 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
f800: 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
f810: 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
f820: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
f830: 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
f840: 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
f850: 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
f860: 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
f870: 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
f880: 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
f890: 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
f8a0: 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
f8b0: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
f8c0: 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
f8d0: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
f8e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
f8f0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
f900: 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
f910: 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
f920: 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
f930: 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
f940: 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
f950: 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
f960: 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
f970: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
f980: 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
f990: 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
f9a0: 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
f9b0: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
f9c0: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
f9d0: 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
f9e0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  minLocal = (pBt-
f9f0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
fa00: 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  32/255 - 23;.  p
fa10: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42  Bt->maxLeaf = pB
fa20: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
fa30: 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  35;.  pBt->minLe
fa40: 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  af = (pBt->usabl
fa50: 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
fa60: 20 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28   - 23;.  assert(
fa70: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
fa80: 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
fa90: 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
faa0: 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
fab0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
fac0: 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e  TE_OK;..page1_in
fad0: 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c  it_failed:.  rel
fae0: 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
faf0: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
fb00: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
fb10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
fb20: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
fb30: 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65  ke lockBtree() e
fb40: 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61 6c  xcept that it al
fb50: 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a  so invokes the.*
fb60: 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  * busy callback 
fb70: 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b  if there is lock
fb80: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a   contention..*/.
fb90: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
fba0: 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42 74  treeWithRetry(Bt
fbb0: 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e  ree *pRef){.  in
fbc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fbd0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
fbe0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
fbf0: 74 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69  tex(pRef) );.  i
fc00: 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73  f( pRef->inTrans
fc10: 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
fc20: 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63      u8 inTransac
fc30: 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74  tion = pRef->pBt
fc40: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  ->inTransaction;
fc50: 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
fc60: 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72  ity(pRef);.    r
fc70: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
fc80: 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c  BeginTrans(pRef,
fc90: 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70   0);.    pRef->p
fca0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
fcb0: 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f  n = inTransactio
fcc0: 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54  n;.    pRef->inT
fcd0: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
fce0: 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  E;.    if( rc==S
fcf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fd00: 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72    pRef->pBt->nTr
fd10: 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
fd20: 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65   }.    btreeInte
fd30: 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d  grity(pRef);.  }
fd40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fd50: 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49         ../*.** I
fd60: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
fd70: 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
fd80: 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
fd90: 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
fda0: 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
fdb0: 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
fdc0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
fdd0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
fde0: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
fdf0: 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
fe00: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
fe10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
fe20: 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
fe30: 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
fe40: 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
fe50: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
fe60: 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61  e are any outsta
fe70: 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74  nding cursors, t
fe80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
fe90: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
fea0: 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
feb0: 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
fec0: 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
fed0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
fee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
fef0: 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
ff00: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
ff10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ff20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ff30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
ff40: 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
ff50: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
ff60: 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f  E && pBt->pCurso
ff70: 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61  r==0 && pBt->pPa
ff80: 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ge1!=0 ){.    if
ff90: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
ffa0: 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
ffb0: 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20  er)>=1 ){.      
ffc0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
ffd0: 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69  ge1->aData );.#i
ffe0: 66 20 30 0a 20 20 20 20 20 20 69 66 28 20 70 42  f 0.      if( pB
fff0: 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
10000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  ==0 ){.        M
10010 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
10020 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
10030 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74       pPage->aDat
10040 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
10050 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
10060 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
10070 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
10080 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  t;.        pPage
10090 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20  ->pgno = 1;.    
100a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
100b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
100c0 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  ->pPage1);.    }
100d0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
100e0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
100f0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
10100 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
10110 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
10120 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
10130 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
10140 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
10150 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
10160 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
10170 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
10180 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
10190 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  c;.  int nPage;.
101a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
101b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
101c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
101d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
101e0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
101f0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
10200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10210 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29  _OK || nPage>0 )
10220 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10230 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
10240 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
10250 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
10260 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
10270 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
10280 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
10290 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
102a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
102b0 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
102c0 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
102d0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
102e0 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
102f0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
10300 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
10310 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
10320 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
10330 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
10340 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
10350 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
10360 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
10370 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
10380 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
10390 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
103a0 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
103b0 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
103c0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
103d0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
103e0 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
103f0 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
10400 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
10410 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
10420 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
10430 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
10440 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
10450 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
10460 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
10470 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
10480 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
10490 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
104a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
104b0 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
104c0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
104d0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
104e0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
104f0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
10500 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
10510 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
10520 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
10530 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
10540 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
10550 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
10560 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
10570 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10580 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
10590 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
105a0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
105b0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
105c0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
105d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
105e0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
105f0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
10600 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
10610 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
10620 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
10630 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
10640 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
10650 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
10660 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
10670 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
10680 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
10690 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
106a0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
106b0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
106c0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
106d0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
106e0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
106f0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
10700 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
10710 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
10720 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
10730 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
10740 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
10750 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
10760 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
10770 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
10780 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
10790 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
107a0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
107b0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
107c0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
107d0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
107e0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
107f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
10800 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
10810 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
10820 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
10830 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
10840 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
10850 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
10860 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
10870 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
10880 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
10890 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
108a0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
108b0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
108c0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
108d0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
108e0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
108f0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
10900 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
10910 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
10920 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
10930 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
10940 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
10950 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
10960 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
10970 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
10980 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
10990 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
109a0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
109b0 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
109c0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
109d0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
109e0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
109f0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
10a00 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
10a10 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
10a20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
10a30 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
10a40 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
10a50 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
10a60 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
10a70 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
10a80 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
10a90 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
10aa0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
10ab0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
10ac0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
10ad0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
10ae0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
10af0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
10b00 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
10b10 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
10b20 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
10b30 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
10b40 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
10b50 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
10b60 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
10b70 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
10b80 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
10b90 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
10ba0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
10bb0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
10bc0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
10bd0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
10be0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
10bf0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
10c00 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
10c10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10c20 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
10c30 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
10c40 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
10c50 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
10c60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10c70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
10c80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10c90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10ca0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
10cb0 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65  = p->db;.  btree
10cc0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
10cd0 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
10ce0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
10cf0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10d00 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
10d10 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
10d20 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
10d30 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
10d40 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
10d50 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
10d60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
10d70 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
10d80 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
10d90 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
10da0 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
10db0 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
10dc0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
10dd0 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  }..  /* Write tr
10de0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
10df0 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
10e00 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
10e10 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ase */.  if( pBt
10e20 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72  ->readOnly && wr
10e30 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
10e40 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
10e50 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
10e60 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
10e70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10e80 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
10e90 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
10ea0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
10eb0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
10ec0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
10ed0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
10ee0 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
10ef0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
10f00 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
10f10 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
10f20 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
10f30 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
10f40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
10f50 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
10f60 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
10f70 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
10f80 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20  >isPending ){.  
10f90 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
10fa0 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d  pWriter->db;.  }
10fb0 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
10fc0 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
10fd0 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
10fe0 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
10ff0 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
11000 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
11010 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
11020 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
11030 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
11040 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
11050 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11060 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11070 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b  .  if( pBlock ){
11080 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
11090 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
110a0 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
110b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
110c0 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
110d0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
110e0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64  _begun;.  }.#end
110f0 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  if..  do {.    /
11100 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
11110 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
11120 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
11130 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
11140 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
11150 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
11160 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
11170 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
11180 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
11190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
111a0 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
111b0 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
111c0 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
111d0 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
111e0 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
111f0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
11200 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
11210 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
11220 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
11230 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
11240 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
11250 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
11260 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
11270 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
11280 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
11290 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
112a0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
112b0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
112c0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
112d0 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
112e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
112f0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
11300 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
11310 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
11320 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
11330 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
11340 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11350 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
11360 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 77 72  (pBt->pPager, wr
11370 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
11380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
113a0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
113b0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
113c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
113d0 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
113e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
113f0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
11400 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
11410 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
11420 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
11430 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11440 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
11450 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
11460 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11470 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
11480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11490 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
114a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
114b0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
114c0 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20  ransaction++;.  
114d0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
114e0 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
114f0 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
11500 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
11510 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
11520 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
11530 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
11540 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
11550 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rans;.    }.#ifn
11560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11570 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
11580 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
11590 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
115a0 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
115b0 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
115c0 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
115d0 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28  >isExclusive = (
115e0 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20  u8)(wrflag>1);. 
115f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
11600 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
11610 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11620 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
11630 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
11640 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
11650 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
11660 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
11670 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
11680 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
11690 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
116a0 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
116b0 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
116c0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
116d0 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
116e0 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
116f0 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
11700 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
11710 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11720 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
11730 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
11740 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
11750 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
11760 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
11770 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11780 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
117a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
117b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
117c0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
117d0 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
117e0 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
117f0 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
11800 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
11810 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
11820 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
11830 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
11840 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
11850 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
11860 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
11870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
11880 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
11890 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
118a0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
118d0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
118e0 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11900 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
11910 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
11920 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
11950 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
11960 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
11970 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
11980 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
11990 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
119a0 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
119b0 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
119c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
119d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
119e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
119f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
11a00 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
11a10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11a20 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
11a30 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
11a40 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
11a50 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
11a60 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
11a70 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
11a80 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
11a90 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
11aa0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
11ab0 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
11ac0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
11ad0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11ae0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
11af0 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
11b00 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
11b10 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
11b20 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
11b30 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
11b40 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
11b50 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
11b60 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
11b70 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
11b80 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
11b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11ba0 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
11bb0 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
11bc0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
11bd0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
11be0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
11bf0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
11c00 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
11c10 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
11c20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
11c30 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
11c40 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
11c50 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f  pgno);.  }..set_
11c60 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
11c70 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
11c80 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
11c90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11ca0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
11cb0 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68   on pPage, which
11cc0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
11cd0 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  o be a btree pag
11ce0 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c  e, not an overfl
11cf0 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61  ow.** page, is a
11d00 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
11d10 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74   iFrom. Modify t
11d20 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  his pointer so t
11d30 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
11d40 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74  .** iTo. Paramet
11d50 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
11d60 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
11d70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64  ointer to be mod
11d80 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f  ified, as .** fo
11d90 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
11da0 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
11db0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
11dc0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
11dd0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
11de0 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
11df0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
11e00 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
11e10 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
11e20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
11e30 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
11e40 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
11e50 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11e70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
11e80 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
11e90 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
11ea0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
11eb0 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
11ec0 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
11ed0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
11ee0 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
11ef0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
11f00 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
11f10 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
11f20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
11f30 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
11f40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
11f50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
11f60 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
11f70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11f80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
11f90 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
11fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11fb0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
11fc0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
11fd0 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
11fe0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
11ff0 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
12000 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
12010 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
12020 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
12030 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
12040 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
12050 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
12060 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
12070 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12080 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12090 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
120a0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
120b0 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
120c0 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
120d0 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
120e0 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
120f0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
12100 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
12110 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
12120 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
12130 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
12140 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
12150 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
12160 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
12170 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
12180 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
12190 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
121a0 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
121b0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
121c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
121d0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
121e0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
121f0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
12200 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
12210 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
12220 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65  m==get4byte(&pCe
12230 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
12240 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w]) ){.         
12250 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
12260 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
12270 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
12280 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
122a0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
122b0 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
122c0 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
122d0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
122e0 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
122f0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
12300 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
12310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12320 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
12330 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
12340 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
12350 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
12360 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
12370 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
12380 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
12390 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
123a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
123b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
123c0 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
123d0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
123e0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
123f0 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
12400 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
12410 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
12420 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
12430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
12440 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
12450 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
12460 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
12470 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
12480 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
12490 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
124a0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
124b0 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74  s valid..*/.stat
124c0 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
124d0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
124e0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
124f0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
12500 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
12510 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
12520 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
12530 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
12540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
12550 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
12560 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
12570 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
12580 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
12590 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
125a0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
125b0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
125c0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
125d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
125e0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
125f0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
12600 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b   int isCommit.){
12610 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
12620 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
12630 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
12640 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
12650 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
12660 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
12670 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
12680 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
12690 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
126a0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
126b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
126c0 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
126d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
126e0 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
126f0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
12700 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
12710 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
12720 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12730 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
12740 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
12750 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
12760 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
12770 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
12780 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
12790 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
127a0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
127b0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
127c0 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
127d0 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
127e0 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
127f0 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
12800 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
12810 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
12820 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
12830 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12840 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
12850 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
12860 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
12870 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
12880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12890 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
128a0 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
128b0 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
128c0 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
128d0 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
128e0 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
128f0 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
12900 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
12910 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
12920 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
12930 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
12940 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
12950 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
12960 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
12970 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
12980 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
12990 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
129a0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
129b0 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
129c0 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
129d0 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
129e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
129f0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
12a00 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
12a10 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
12a20 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
12a30 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
12a40 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
12a50 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
12a60 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
12a70 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
12a80 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
12a90 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
12aa0 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
12ab0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12ac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12ad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12ae0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
12af0 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
12b00 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
12b10 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
12b20 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
12b30 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
12b40 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
12b50 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
12b60 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29  LOW2, iFreePage)
12b70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12b90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12bb0 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
12bc0 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
12bd0 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
12be0 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
12bf0 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
12c00 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
12c10 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
12c20 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
12c30 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
12c40 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
12c50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
12c60 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
12c70 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
12c80 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
12c90 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
12ca0 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
12cb0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12cc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12cd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12ce0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12cf0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
12d00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
12d10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
12d30 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
12d40 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
12d50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12d60 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
12d70 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
12d80 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
12d90 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
12da0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
12db0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
12dc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12dd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
12de0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
12df0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
12e00 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  trPage);.    }. 
12e10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12e20 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
12e30 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
12e40 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
12e50 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
12e60 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
12e70 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
12e80 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
12e90 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
12ea0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
12eb0 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
12ec0 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
12ed0 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
12ee0 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75  cessful,.** retu
12ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
12f00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
12f10 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
12f20 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69  refore no.** poi
12f30 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68  nt in calling th
12f40 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
12f50 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
12f60 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  E_DONE..**.** Mo
12f70 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74  re specificly, t
12f80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
12f90 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
12fa0 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74  nize the .** dat
12fb0 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68  abase so that th
12fc0 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
12fd0 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
12fe0 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e  y in use.** is n
12ff0 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
13000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46  .**.** If the nF
13010 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  in parameter is 
13020 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d  non-zero, the im
13030 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73  plementation ass
13040 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
13050 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
13060 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
13070 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
13080 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
13090 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
130a0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
130b0 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
130c0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
130d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
130e0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
130f0 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
13100 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
13110 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13120 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
13130 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
13140 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
13150 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20  LastPg){.  Pgno 
13160 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
13170 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13180 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
13190 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
131a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
131b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
131c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
131d0 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
131e0 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
131f0 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
13200 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
13210 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
13220 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
13230 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
13240 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
13250 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
13260 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
13270 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
13280 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
13290 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
132a0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
132b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
132c0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
132d0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
132e0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
132f0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
13300 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13320 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13330 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
13340 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
13350 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13360 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13370 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
13380 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
13390 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
133a0 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
133b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
133c0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
133d0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
133e0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
133f0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
13400 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
13410 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
13420 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
13430 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
13440 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
13450 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
13460 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
13470 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
13480 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
13490 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
134a0 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
134b0 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
134c0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
134d0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
134e0 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
134f0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
13500 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
13510 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
13520 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
13530 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
13540 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
13550 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13560 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
13570 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13580 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
13590 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
135a0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
135b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
135c0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
135d0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
135e0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
135f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13600 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
13610 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
13620 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
13630 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
13640 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13650 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
13660 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
13670 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
13680 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
136a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
136b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
136c0 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
136d0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
136e0 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
136f0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
13700 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
13710 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
13720 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
13730 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
13740 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
13750 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
13760 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
13770 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
13780 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
13790 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
137a0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
137b0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
137c0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
137d0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
137e0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
137f0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
13800 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
13810 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
13820 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
13830 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
13840 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
13850 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
13860 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
13870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13880 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
13890 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
138a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
138b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
138c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
138d0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
138e0 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
138f0 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
13900 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13910 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
13920 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
13930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13940 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
13950 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
13960 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13970 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
13980 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
13990 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
139a0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
139b0 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
139c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
139d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
139e0 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
139f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13a00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13a10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
13a20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
13a30 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
13a40 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
13a50 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
13a60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
13a70 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
13a80 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
13a90 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  {.      if( PTRM
13aa0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
13ab0 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
13ac0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b     MemPage *pPg;
13ad0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
13ae0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
13af0 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
13b00 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20  Pg, &pPg, 0);.  
13b10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13b20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13b30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13b60 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
13b70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
13b80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
13b90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13ba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13bb0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13bc0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73      }.      iLas
13be0 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  tPg--;.    }.   
13bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
13c00 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
13c10 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29  pPager, iLastPg)
13c20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
13c30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13c40 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
13c50 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
13c60 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
13c70 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
13c80 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
13c90 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
13ca0 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
13cb0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
13cc0 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
13cd0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
13ce0 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
13cf0 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
13d00 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
13d10 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
13d20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
13d30 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
13d40 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
13d50 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
13d60 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
13d70 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
13d80 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
13d90 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
13da0 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
13db0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
13dc0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
13dd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13de0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
13df0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
13e00 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
13e10 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
13e20 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13e30 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
13e40 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
13e50 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
13e60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
13e70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13e80 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
13e90 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
13ea0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
13eb0 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e  Bt);.    rc = in
13ec0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
13ed0 2c 20 30 2c 20 70 61 67 65 72 50 61 67 65 63 6f  , 0, pagerPageco
13ee0 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20  unt(pBt));.  }. 
13ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13f00 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
13f10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
13f20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13f30 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
13f40 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
13f50 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
13f60 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65  on.** is commite
13f70 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
13f80 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
13f90 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
13fa0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
13fb0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
13fc0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
13fd0 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
13fe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13ff0 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
14000 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
14010 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
14020 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
14030 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
14040 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
14050 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
14060 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
14070 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
14080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14090 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
140a0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
140b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
140c0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
140d0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
140e0 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
140f0 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
14100 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
14110 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
14120 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14130 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14140 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
14150 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
14160 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
14170 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
14180 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
14190 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
141a0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
141b0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
141c0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  .    Pgno nPtrma
141d0 70 3b 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  p;.    Pgno iFre
141e0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e;.    const int
141f0 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67   pgsz = pBt->pag
14200 65 53 69 7a 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eSize;.    Pgno 
14210 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61 67  nOrig = pagerPag
14220 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 0a 20 20  ecount(pBt);..  
14230 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
14240 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
14250 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14260 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14270 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
14280 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  f( nOrig==PENDIN
14290 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
142a0 20 29 7b 0a 20 20 20 20 20 20 6e 4f 72 69 67 2d   ){.      nOrig-
142b0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72  -;.    }.    nFr
142c0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
142d0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
142e0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 50 74 72  a[36]);.    nPtr
142f0 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
14300 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
14310 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
14320 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
14330 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20     nFin = nOrig 
14340 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
14350 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  p;.    if( nOrig
14360 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
14370 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
14380 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
14390 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
143a0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   nFin--;.    }. 
143b0 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
143c0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
143d0 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
143e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
143f0 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e  t) ){.      nFin
14400 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  --;.    }..    f
14410 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
14420 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
14430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
14440 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
14450 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
14460 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
14470 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
14480 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
14490 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
144a0 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
144b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
144c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72  LITE_OK;.      r
144d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
144e0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
144f0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
14500 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
14510 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
14520 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
14530 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
14540 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
14550 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
14560 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
14570 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
14580 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nFin);.    }. 
14590 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
145a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
145b0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
145c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
145d0 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
145e0 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61   nRef==sqlite3Pa
145f0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
14600 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
14610 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
14620 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
14630 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
14640 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
14650 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
14660 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
14670 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
14680 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
14690 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
146a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
146b0 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
146c0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
146d0 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
146e0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
146f0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
14700 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
14710 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
14720 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
14730 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
14740 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
14750 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
14760 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
14770 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
14780 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
14790 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
147a0 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
147b0 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
147c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
147d0 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
147e0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
147f0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
14800 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
14810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14820 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
14830 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
14840 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
14850 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
14860 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
14870 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
14880 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
14890 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
148a0 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
148b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
148c0 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
148d0 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
148e0 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72  treeCommit() for
148f0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
14900 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
14910 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
14920 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
14930 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
14940 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
14950 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
14960 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
14970 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
14980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14990 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
149a0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
149b0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
149c0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
149d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
149e0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
149f0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
14a00 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
14a10 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
14a20 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
14a30 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
14a40 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
14a50 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
14a60 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
14a70 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
14a80 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
14a90 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
14aa0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
14ab0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
14ac0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
14ad0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
14ae0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
14af0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
14b00 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
14b10 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
14b20 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
14b30 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
14b40 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
14b50 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
14b60 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
14b70 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
14b80 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
14b90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14ba0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
14bb0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
14bc0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
14bd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14be0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
14bf0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
14c00 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
14c10 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
14c20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
14c30 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74  nter(p);.    pBt
14c40 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69  ->db = p->db;.#i
14c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14c60 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14c70 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
14c80 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
14c90 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
14ca0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
14cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14cc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
14cd0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14ce0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
14cf0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
14d00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
14d10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14d20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
14d30 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
14d40 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
14d50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14d60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
14d80 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
14d90 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
14da0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
14db0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
14dc0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
14dd0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
14de0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
14df0 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
14e00 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e  reeSync() routin
14e10 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
14e20 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
14e30 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20  d be invoked.** 
14e40 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
14e50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
14e60 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
14e70 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64  Sync() routine d
14e80 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77 6f  id.** all the wo
14e90 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
14ea0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
14eb0 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
14ec0 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
14ed0 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
14ee0 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
14ef0 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
14f00 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
14f10 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
14f20 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
14f30 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c 6c  runcate the roll
14f40 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  back journal.** 
14f50 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
14f60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
14f70 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72 6f   commit) and dro
14f80 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54  p locks..**.** T
14f90 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
14fa0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
14fb0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14fc0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
14fd0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
14fe0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
14ff0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
15000 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
15010 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15020 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
15030 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
15040 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
15050 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
15060 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
15070 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62  >db = p->db;.  b
15080 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
15090 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
150a0 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
150b0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
150c0 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
150d0 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
150e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
150f0 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
15100 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
15110 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
15120 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
15130 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
15140 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
15150 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
15160 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
15170 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
15180 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
15190 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
151a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
151b0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
151c0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
151d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
151e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
151f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15200 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
15210 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
15220 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
15230 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
15240 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  }..  /* If the h
15250 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69  andle has any ki
15260 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
15270 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
15280 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
15290 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20  n.  ** count of 
152a0 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
152b0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
152c0 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68  tion count reach
152d0 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74  es 0, set.  ** t
152e0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
152f0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
15300 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
15310 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65  Unused() call be
15320 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e  low.  ** will un
15330 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
15340 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
15350 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
15360 45 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 41 6c  E ){.    clearAl
15370 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
15380 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
15390 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
153a0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70  --;.    if( 0==p
153b0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
153c0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
153d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
153e0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  RANS_NONE;.    }
153f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
15400 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65  he handles curre
15410 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
15420 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
15430 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
15440 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
15450 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
15460 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
15470 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
15480 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 62 74 72 65  ion..  */.  btre
15490 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
154a0 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72  (pBt);.  p->inTr
154b0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
154c0 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
154d0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
154e0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
154f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
15500 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15520 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
15530 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
15540 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
15550 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
15560 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
15570 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
15580 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
15590 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
155a0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
155b0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
155c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
155d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
155e0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
155f0 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
15600 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15620 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
15630 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15640 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
15650 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
15660 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
15670 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
15680 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
15690 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
156a0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
156b0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
156c0 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
156d0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
156e0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
156f0 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
15700 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
15710 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
15720 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
15730 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
15740 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
15750 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
15760 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
15770 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
15780 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
15790 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
157a0 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
157b0 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
157c0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
157d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
157e0 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
157f0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
15800 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
15810 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
15820 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
15830 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
15840 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
15850 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
15860 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
15870 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
15880 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
15890 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
158a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
158b0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
158c0 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
158d0 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
158e0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
158f0 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
15900 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
15910 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
15920 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
15930 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
15940 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
15950 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
15960 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
15970 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
15980 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
15990 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
159a0 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
159b0 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
159c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
159d0 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
159e0 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
159f0 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
15a00 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
15a10 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
15a20 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
15a30 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
15a40 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
15a50 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
15a60 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
15a70 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
15a80 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
15a90 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
15aa0 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
15ab0 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
15ac0 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
15ad0 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
15ae0 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
15af0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
15b00 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
15b10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15b20 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
15b30 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
15b40 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
15b50 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
15b60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15b70 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
15b80 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
15b90 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
15ba0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
15bb0 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
15bc0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
15bd0 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
15be0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
15bf0 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
15c00 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
15c10 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
15c20 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
15c30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
15c40 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
15c50 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
15c60 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
15c70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15c80 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
15c90 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
15ca0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
15cb0 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
15cc0 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
15cd0 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
15ce0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
15cf0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
15d00 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
15d10 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
15d20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
15d30 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
15d40 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
15d50 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
15d60 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
15d70 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
15d80 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
15d90 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
15da0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
15db0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
15dc0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
15dd0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
15de0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15df0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
15e00 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
15e10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15e20 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
15e30 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
15e40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15e50 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
15e60 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73   p->db;.  rc = s
15e70 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
15e80 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65  t, 0, 0);.#ifnde
15e90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
15ea0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
15eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15ec0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
15ed0 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75   a horrible situ
15ee0 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20  ation. An IO or 
15ef0 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
15f00 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20  ccurred whilst. 
15f10 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20     ** trying to 
15f20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69  save cursor posi
15f30 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69  tions. If this i
15f40 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72  s an automatic r
15f50 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20  ollback (as.    
15f60 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
15f70 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d   a constraint, m
15f80 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
15f90 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65  or IO error) the
15fa0 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  n .    ** the ca
15fb0 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72  che may be inter
15fc0 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
15fd0 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  nt (not contain 
15fe0 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a  valid trees) so.
15ff0 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74      ** we cannot
16000 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74   simply return t
16010 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  he error to the 
16020 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c  caller. Instead,
16030 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61   abort .    ** a
16040 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20  ll queries that 
16050 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79  may be using any
16060 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
16070 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73  that failed to s
16080 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ave..    */.    
16090 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
160a0 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63  AllCursors(p, rc
160b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
160c0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
160d0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
160e0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
160f0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
16100 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
16110 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
16120 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
16130 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
16140 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
16150 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
16160 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
16170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16180 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
16190 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
161a0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
161b0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
161c0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
161d0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
161e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
161f0 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
16200 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
16210 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
16220 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
16230 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
16240 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
16250 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
16260 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
16270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16280 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
16290 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
162a0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
162b0 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
162c0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
162d0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
162e0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
162f0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
16300 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
16310 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
16320 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
16330 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
16340 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
16350 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  on>0 );.    pBt-
16360 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
16370 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
16380 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
16390 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
163a0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
163b0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
163c0 7d 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48  }..  btreeClearH
163d0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
163e0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
163f0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
16400 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
16410 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
16420 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
16430 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16440 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
16450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
16460 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
16470 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
16480 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
16490 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  can can be rolle
164a0 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
164b0 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
164c0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
164d0 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
164e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
164f0 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
16500 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
16510 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
16520 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
16530 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
16540 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
16550 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
16560 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
16570 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
16580 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
16590 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
165a0 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
165b0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
165c0 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
165d0 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
165e0 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
165f0 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
16600 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
16610 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
16620 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
16630 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
16640 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
16650 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
16660 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
16670 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
16680 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
16690 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
166a0 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
166b0 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
166c0 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
166d0 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
166e0 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
166f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
16700 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
16710 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
16720 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
16730 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
16740 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
16750 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
16760 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
16770 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
16780 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
16790 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
167a0 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
167b0 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
167c0 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
167d0 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
167e0 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
167f0 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
16800 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
16810 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
16820 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
16830 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
16840 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
16850 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
16860 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
16870 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
16880 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16890 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
168a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
168b0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
168c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
168d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
168e0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
168f0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
16900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
16910 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
16920 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
16930 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
16940 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  int );.  if( NEV
16950 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ER(p->inTrans!=T
16960 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42  RANS_WRITE || pB
16970 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  t->readOnly) ){.
16980 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16990 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73  INTERNAL;.  }els
169a0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
169b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
169c0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
169d0 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20  ;.    /* At the 
169e0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
169f0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
16a00 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
16a10 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  int with.    ** 
16a20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
16a30 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
16a40 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
16a50 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
16a60 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
16a70 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
16a80 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
16a90 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
16aa0 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
16ab0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
16ac0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
16ad0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
16ae0 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
16af0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
16b00 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
16b10 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
16b20 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
16b30 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
16b40 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16b50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16b60 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
16b70 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
16b80 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
16b90 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
16ba0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
16bb0 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
16bc0 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
16bd0 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
16be0 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
16bf0 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
16c00 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
16c10 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
16c20 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
16c30 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
16c40 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
16c50 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
16c60 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
16c70 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
16c80 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
16c90 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
16ca0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
16cb0 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
16cc0 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
16cd0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
16ce0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
16cf0 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
16d00 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
16d10 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
16d20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
16d30 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
16d40 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
16d50 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
16d60 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
16d70 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
16d80 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
16d90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16da0 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
16db0 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
16dc0 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
16dd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16de0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
16df0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
16e00 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
16e10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16e20 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
16e30 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
16e40 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
16e50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
16e60 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
16e70 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
16e80 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
16e90 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
16ea0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
16eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
16ec0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 70  eEnter(p);.    p
16ed0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
16ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16ef0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
16f00 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
16f10 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
16f20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16f30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
16f40 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
16f50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
16f60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16f70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16f80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
16f90 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
16fa0 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
16fb0 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
16fc0 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
16fd0 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20  le.  The act of 
16fe0 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73  acquiring a curs
16ff0 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c  or gets a read l
17000 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64  ock on .** the d
17010 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
17020 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
17030 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
17040 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
17050 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
17060 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
17070 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
17080 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
17090 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
170a0 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
170b0 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
170c0 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
170d0 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
170e0 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
170f0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
17100 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
17110 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
17120 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
17130 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
17140 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
17150 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
17160 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
17170 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
17180 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
17190 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
171a0 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
171b0 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
171c0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
171d0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
171e0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
171f0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
17200 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
17210 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
17220 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
17230 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
17240 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
17250 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
17260 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
17270 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
17280 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
17290 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
172a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
172b0 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
172c0 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
172d0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
172e0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
172f0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
17300 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
17310 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
17320 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
17330 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
17340 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
17350 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
17360 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
17370 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
17380 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
17390 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
173a0 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
173b0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
173c0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
173d0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
173e0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
173f0 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20  Size() bytes of 
17400 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74  memory .** point
17410 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61  ed to by pCur ha
17420 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  ve been zeroed b
17430 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  y the caller..*/
17440 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
17450 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
17460 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17480 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
17490 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
174c0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
174d0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
174e0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
17510 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
17520 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
17530 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
17540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17550 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
17560 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
17570 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
17580 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
17590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
175a0 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
175b0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sor */.){.  int 
175c0 72 63 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  rc;.  Pgno nPage
175d0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
175e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
175f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
17600 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
17610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
17620 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
17630 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 77 72  g==1 );.  if( wr
17640 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73 65  Flag ){.    asse
17650 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
17660 6c 79 20 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  ly );.    if( NE
17670 56 45 52 28 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  VER(pBt->readOnl
17680 79 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  y) ){.      retu
17690 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
176a0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  LY;.    }.    rc
176b0 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43   = checkForReadC
176c0 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
176d0 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  le, 0, 0);.    i
176e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
176f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43  ( rc==SQLITE_LOC
17710 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 20  KED_SHAREDCACHE 
17720 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17730 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
17740 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
17750 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
17760 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
17770 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ry(p);.    if( r
17780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17790 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
177a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
177b0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
177c0 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72 63  gno)iTable;.  rc
177d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
177e0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
177f0 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
17800 61 67 65 29 3b 20 0a 20 20 69 66 28 20 72 63 21  age); .  if( rc!
17810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
17830 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
17840 20 26 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a   && nPage==0 ){.
17850 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17860 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
17870 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
17880 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
17890 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
178a0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
178b0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
178c0 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28  pPage[0]);.  if(
178d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
178e0 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  {.    goto creat
178f0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
17900 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  on;.  }..  /* No
17910 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
17920 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
17930 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
17940 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
17950 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c  .  ** variables,
17960 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
17970 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
17980 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20  ed list and set 
17990 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a  *ppCur (the.  **
179a0 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74   output argument
179b0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
179c0 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  n)..  */.  pCur-
179d0 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
179e0 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
179f0 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
17a00 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
17a10 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75  Cur->wrFlag = (u
17a20 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  8)wrFlag;.  pCur
17a30 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
17a40 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
17a50 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
17a60 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
17a70 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
17a80 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
17a90 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
17aa0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
17ab0 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e  NVALID;.  pCur->
17ac0 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b  cachedRowid = 0;
17ad0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
17ae0 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75  E_OK;..create_cu
17af0 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a  rsor_exception:.
17b00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
17b10 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
17b20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
17b30 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65  nused(pBt);.  re
17b40 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
17b50 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17b60 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b90 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
17ba0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17bd0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
17be0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
17bf0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c20 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
17c30 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
17c40 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
17c50 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
17c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
17c70 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
17c80 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
17c90 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cb0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
17cc0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
17cd0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
17ce0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17cf0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
17d00 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
17d10 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
17d20 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
17d30 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
17d40 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
17d50 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17d60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17d70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
17d80 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
17d90 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
17da0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
17db0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
17dc0 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
17dd0 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
17de0 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
17df0 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
17e00 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
17e10 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
17e20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
17e30 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
17e40 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
17e50 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
17e60 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
17e70 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
17e80 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
17e90 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17ea0 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
17eb0 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74  return sizeof(Bt
17ec0 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Cursor);.}../*.*
17ed0 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64  * Set the cached
17ee0 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20   rowid value of 
17ef0 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20  every cursor in 
17f00 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
17f10 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75  e file.** as pCu
17f20 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65  r and having the
17f30 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20   same root page 
17f40 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20  number as pCur. 
17f50 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   The value is.**
17f60 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a   set to iRowid..
17f70 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74  **.** Only posit
17f80 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ive rowid values
17f90 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
17fa0 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63  valid for this c
17fb0 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63  ache..** The cac
17fc0 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  he is initialize
17fd0 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63  d to zero, indic
17fe0 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64  ating an invalid
17ff0 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72   cache..** A btr
18000 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ee will work fin
18010 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e  e with zero or n
18020 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20  egative rowids. 
18030 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a   We just cannot.
18040 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72  ** cache zero or
18050 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
18060 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61  , which means ta
18070 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65  bles that use ze
18080 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76  ro or.** negativ
18090 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72  e rowids might r
180a0 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
180b0 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63  er.  But in prac
180c0 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tice, zero.** or
180d0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
180e0 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d   are very uncomm
180f0 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c  on so this shoul
18100 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  d not be a probl
18110 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
18120 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
18130 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
18140 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69  *pCur, sqlite3_i
18150 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20  nt64 iRowid){.  
18160 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
18170 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e  or(p=pCur->pBt->
18180 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
18190 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
181a0 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43   p->pgnoRoot==pC
181b0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70  ur->pgnoRoot ) p
181c0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
181d0 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73  iRowid;.  }.  as
181e0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68  sert( pCur->cach
181f0 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20  edRowid==iRowid 
18200 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
18210 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  rn the cached ro
18220 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  wid for the give
18230 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67  n cursor.  A neg
18240 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ative or zero.**
18250 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
18260 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
18270 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20   rowid cache is 
18280 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
18290 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64  ld be.** ignored
182a0 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  .  If the rowid 
182b0 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20  cache has never 
182c0 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c  before been set,
182d0 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20   then a.** zero 
182e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
182f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
18300 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
18310 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
18320 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
18330 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  rn pCur->cachedR
18340 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  owid;.}../*.** C
18350 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
18360 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
18370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18380 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
18390 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
183a0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
183b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
183c0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
183d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
183e0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
183f0 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
18400 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
18410 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
18420 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18430 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
18440 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18450 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
18460 42 74 2d 3e 64 62 20 3d 20 70 42 74 72 65 65 2d  Bt->db = pBtree-
18470 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >db;.    sqlite3
18480 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
18490 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
184a0 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
184b0 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76       pCur->pPrev
184c0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
184d0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
184e0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
184f0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
18500 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
18510 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
18520 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  .      pCur->pNe
18530 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
18540 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20  ->pPrev;.    }. 
18550 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
18560 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
18570 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
18580 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
18590 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
185a0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
185b0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
185c0 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
185d0 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
185e0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
185f0 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
18600 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18610 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
18620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
18640 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
18650 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e  or by filling in
18660 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70   the fields of p
18670 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20  TempCur..** The 
18680 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
18690 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
186a0 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74  ursor list for t
186b0 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  he Btree..*/.voi
186c0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  d sqlite3BtreeGe
186d0 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  tTempCursor(BtCu
186e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75  rsor *pCur, BtCu
186f0 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b  rsor *pTempCur){
18700 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
18710 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
18720 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
18730 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c  memcpy(pTempCur,
18740 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74   pCur, sizeof(Bt
18750 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d  Cursor));.  pTem
18760 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pCur->pNext = 0;
18770 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72  .  pTempCur->pPr
18780 65 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ev = 0;.  for(i=
18790 30 3b 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e  0; i<=pTempCur->
187a0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
187b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
187c0 28 70 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67  (pTempCur->apPag
187d0 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a  e[i]->pDbPage);.
187e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
187f0 65 6d 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20  empCur->pKey==0 
18800 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
18810 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  te a temporary c
18820 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61  ursor such as wa
18830 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72  s made by the Cr
18840 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72  eateTemporaryCur
18850 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  sor().** functio
18860 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64  n above..*/.void
18870 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
18880 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42  easeTempCursor(B
18890 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
188a0 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
188b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
188c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66  tex(pCur) );.  f
188d0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
188e0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
188f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
18900 72 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ref(pCur->apPage
18910 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
18920 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
18930 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d  e(pCur->pKey);.}
18940 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  ..../*.** Make s
18950 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
18960 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
18970 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
18980 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
18990 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
189a0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
189b0 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
189c0 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  l.** sqlite3Btre
189d0 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
189e0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
189f0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
18a00 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
18a10 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
18a20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
18a30 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
18a40 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
18a50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
18a60 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
18a70 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
18a80 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
18a90 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
18aa0 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
18ab0 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
18ac0 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
18ad0 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
18ae0 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
18af0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
18b00 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
18b10 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
18b20 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
18b30 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
18b40 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
18b50 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
18b60 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
18b70 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
18b80 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
18b90 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
18ba0 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
18bb0 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
18bc0 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
18bd0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
18be0 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
18bf0 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
18c00 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
18c10 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
18c20 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
18c30 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
18c40 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
18c50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
18c60 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
18c70 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
18c80 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
18c90 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
18ca0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
18cb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
18cc0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
18cd0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
18ce0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
18cf0 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
18d00 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
18d10 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
18d20 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
18d30 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
18d40 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
18d50 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
18d60 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
18d70 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
18d80 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
18d90 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
18da0 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
18db0 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
18dc0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
18dd0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
18de0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
18df0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
18e00 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
18e10 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
18e20 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 73  ->iPage;.      s
18e30 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
18e40 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
18e50 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
18e60 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
18e70 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
18e80 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
18e90 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
18ea0 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c        assertCell
18eb0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
18ec0 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  }.  }.#else /* i
18ed0 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a  f not _MSC_VER *
18ee0 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63  /.  /* Use a mac
18ef0 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ro in all other 
18f00 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61  compilers so tha
18f10 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
18f20 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65  s inlined */.#de
18f30 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f  fine getCellInfo
18f40 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
18f80 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
18f90 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20  Size==0 ){      
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
18fd0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
18fe0 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20  Cur->iPage;     
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
19020 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19030 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
19040 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
19050 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
19060 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c  ,&pCur->info); \
19070 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
19080 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
19120 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20  lInfo(pCur);    
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    \.  }.#endif /
19170 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f  * _MSC_VER */../
19180 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
19190 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
191a0 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
191b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
191c0 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
191d0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
191e0 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
191f0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
19200 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
19210 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
19220 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
19230 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
19240 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
19250 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
19260 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19270 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
19280 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
19290 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
192a0 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  the key..*/.int 
192b0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
192c0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
192d0 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
192e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
192f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
19300 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19310 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
19320 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
19330 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
19340 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
19350 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19360 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
19370 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
19380 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19390 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
193a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
193b0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
193c0 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
193d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
193e0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
193f0 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  );.      *pSize 
19400 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
19410 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  y;.    }.  }.  r
19420 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19430 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
19440 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19450 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
19460 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
19470 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
19480 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c  y points to.  Al
19490 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49  ways return SQLI
194a0 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72  TE_OK..** Failur
194b0 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
194c0 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
194d0 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  r is not current
194e0 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ly.** pointing t
194f0 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63  o an entry (whic
19500 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f  h can happen, fo
19510 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
19520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
19530 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53   empty) then *pS
19540 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
19550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19560 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
19570 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
19580 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
19590 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
195a0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
195b0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
195c0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
195d0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
195e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
195f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19600 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19610 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
19620 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19630 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
19640 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19650 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
19660 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  ID ){.      /* N
19670 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
19680 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73   valid entry - s
19690 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20  et *pSize to 0. 
196a0 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  */.      *pSize 
196b0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
196c0 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
196d0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
196e0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
196f0 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a  fo.nData;.    }.
19700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
19720 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
19730 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
19740 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
19750 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
19760 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
19770 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
19780 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
19790 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
197a0 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
197b0 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
197c0 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
197d0 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
197e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
197f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
19800 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
19810 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
19820 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
19830 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
19840 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
19850 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
19860 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
19870 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
19880 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
19890 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
198a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
198b0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
198c0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
198d0 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
198e0 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
198f0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
19900 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
19910 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
19920 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
19930 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
19940 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
19950 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
19960 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
19970 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
19980 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
19990 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
199a0 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
199b0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
199c0 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
199d0 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
199e0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
199f0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
19a00 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
19a10 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
19a20 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
19a30 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
19a40 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
19a50 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
19a60 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
19a70 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
19a80 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
19a90 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
19aa0 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
19ab0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
19ac0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
19ad0 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
19ae0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
19af0 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  Bt, .  Pgno ovfl
19b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19b10 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20      /* Overflow 
19b20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  page */.  MemPag
19b30 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
19b40 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
19b50 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
19b60 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
19b70 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b90 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
19ba0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
19bb0 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
19bc0 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
19bd0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
19be0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19bf0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
19c00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19c10 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19c20 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
19c30 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
19c40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19c50 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
19c60 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
19c70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
19c80 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
19c90 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
19ca0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
19cb0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
19cc0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
19cd0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
19ce0 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
19cf0 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
19d00 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
19d10 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
19d20 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
19d30 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
19d40 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
19d50 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
19d60 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
19d70 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
19d80 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
19d90 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
19da0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
19db0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
19dc0 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
19dd0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
19de0 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
19df0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
19e00 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
19e10 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
19e20 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
19e30 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
19e40 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
19e50 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
19e60 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
19e70 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
19e80 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
19e90 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
19ea0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19eb0 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
19ec0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
19ed0 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
19ee0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
19ef0 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
19f00 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
19f10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19f20 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
19f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19f40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19f50 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
19f60 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
19f70 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72  0);.    assert(r
19f80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
19f90 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69  pPage==0);.    i
19fa0 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63  f( next==0 && rc
19fb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19fc0 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
19fd0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
19fe0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
19ff0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
1a000 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
1a010 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
1a020 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
1a030 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
1a040 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
1a050 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
1a060 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
1a070 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
1a080 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
1a090 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
1a0a0 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
1a0b0 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
1a0c0 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
1a0d0 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
1a0e0 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
1a0f0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1a100 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
1a110 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
1a120 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
1a130 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
1a140 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
1a150 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
1a160 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
1a170 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
1a180 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
1a190 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
1a1a0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
1a1b0 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
1a1c0 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
1a1d0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
1a1e0 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
1a1f0 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
1a200 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
1a210 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1a220 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
1a230 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
1a240 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1a250 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
1a260 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
1a270 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1a280 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
1a290 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
1a2a0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1a2b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1a2c0 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
1a2d0 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
1a2e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a2f0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
1a300 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a320 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
1a330 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
1a340 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
1a350 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
1a360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1a370 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
1a380 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
1a390 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
1a3a0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1a3b0 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
1a3c0 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
1a3d0 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
1a3e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1a3f0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1a400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1a420 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a430 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
1a440 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
1a450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1a460 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1a470 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
1a480 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
1a490 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
1a4a0 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
1a4b0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
1a4c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a4d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1a4e0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1a4f0 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
1a500 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
1a510 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
1a520 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1a530 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
1a540 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
1a550 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
1a560 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
1a570 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
1a580 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
1a590 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
1a5a0 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
1a5b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
1a5c0 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
1a5d0 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
1a5e0 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
1a5f0 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
1a600 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
1a610 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
1a620 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
1a630 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
1a640 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
1a650 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
1a660 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1a670 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69  es not make a di
1a680 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65  stinction betwee
1a690 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a  n key and data..
1a6a0 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73  ** It just reads
1a6b0 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73   or writes bytes
1a6c0 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61   from the payloa
1a6d0 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69  d area.  Data mi
1a6e0 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f  ght .** appear o
1a6f0 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20  n the main page 
1a700 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1a710 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1a720 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67  overflow .** pag
1a730 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
1a740 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
1a750 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1a760 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
1a770 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
1a780 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
1a790 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
1a7a0 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
1a7b0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
1a7c0 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
1a7d0 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
1a7e0 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
1a7f0 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
1a800 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
1a810 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
1a820 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
1a830 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
1a840 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
1a850 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
1a860 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
1a870 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
1a880 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
1a890 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1a8a0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1a8b0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
1a8c0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
1a8d0 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
1a8e0 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
1a8f0 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
1a900 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
1a910 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
1a920 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
1a930 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
1a940 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
1a950 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
1a960 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
1a970 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
1a980 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1a990 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
1a9a0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1a9b0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
1a9c0 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
1a9d0 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
1a9e0 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
1a9f0 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
1aa00 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
1aa10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
1aa20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1aa30 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
1aa40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1aa50 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
1aa60 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
1aa70 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
1aa80 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
1aa90 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1aaa0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
1aab0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
1aac0 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
1aad0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
1aae0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1aaf0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1ab00 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
1ab10 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
1ab20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
1ab30 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  / .  int skipKey
1ab40 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  ,         /* off
1ab50 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61  set begins at da
1ab60 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
1ab70 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20  ue */.  int eOp 
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab90 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
1aba0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
1abb0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1abc0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
1abd0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1abe0 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
1abf0 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
1ac00 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1ac10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1ac20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1ac30 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
1ac40 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
1ac50 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1ac60 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
1ac90 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
1aca0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
1acb0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1acc0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1acd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1ace0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1acf0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1ad00 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
1ad10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1ad20 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ad30 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
1ad40 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1ad50 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1ad60 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
1ad70 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1ad80 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
1ad90 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
1ada0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1adb0 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b  nKey);..  if( sk
1adc0 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66  ipKey ){.    off
1add0 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d  set += nKey;.  }
1ade0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d  .  if( offset+am
1adf0 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
1ae00 6e 66 6f 2e 6e 44 61 74 61 20 0a 20 20 20 7c 7c  nfo.nData .   ||
1ae10 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
1ae20 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
1ae30 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
1ae40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
1ae50 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
1ae60 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
1ae70 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
1ae80 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
1ae90 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
1aea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1aeb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1aec0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
1aed0 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
1aee0 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
1aef0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
1af00 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
1af10 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
1af20 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1af30 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1af40 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
1af50 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1af60 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
1af70 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1af80 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
1af90 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
1afa0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
1afb0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
1afc0 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
1afd0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
1afe0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
1aff0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
1b000 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
1b010 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
1b020 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
1b030 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1b040 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
1b050 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
1b060 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
1b070 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
1b080 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
1b090 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
1b0a0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
1b0b0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
1b0c0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1b0d0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1b0e0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
1b0f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b100 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1b110 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
1b120 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1b130 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
1b140 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1b150 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
1b160 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
1b170 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
1b180 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
1b190 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
1b1a0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
1b1b0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
1b1c0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1b1d0 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
1b1e0 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
1b1f0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
1b200 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
1b210 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
1b220 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
1b230 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
1b240 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
1b250 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
1b260 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
1b270 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
1b280 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
1b290 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
1b2a0 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
1b2b0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
1b2c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1b2d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
1b2e0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
1b2f0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
1b300 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
1b310 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
1b320 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
1b330 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
1b340 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1b350 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
1b360 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69  *nOvfl);.      i
1b370 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75  f( nOvfl && !pCu
1b380 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1b390 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b3a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1b3b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1b3c0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
1b3d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1b3e0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1b3f0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
1b400 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1b410 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
1b420 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1b430 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
1b440 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
1b450 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
1b460 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1b470 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1b480 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
1b490 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
1b4a0 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
1b4b0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
1b4c0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1b4d0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1b4e0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
1b4f0 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
1b500 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1b510 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
1b520 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1b530 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
1b540 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
1b550 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1b560 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
1b570 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
1b580 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
1b590 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1b5a0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
1b5b0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1b5c0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
1b5d0 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
1b5e0 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
1b5f0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1b600 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
1b610 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
1b620 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
1b630 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
1b640 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
1b650 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
1b660 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1b670 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
1b680 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
1b690 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
1b6a0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
1b6b0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
1b6c0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1b6d0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
1b6e0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
1b6f0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
1b700 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
1b710 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
1b720 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
1b730 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
1b740 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
1b750 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
1b760 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
1b770 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
1b780 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
1b790 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
1b7a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b7b0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1b7c0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1b7d0 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1b7e0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1b7f0 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
1b800 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1b810 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1b820 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
1b830 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
1b840 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
1b850 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1b860 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
1b870 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1b880 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
1b890 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
1b8a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
1b8b0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
1b8c0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
1b8d0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
1b8e0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1b8f0 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
1b900 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
1b910 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
1b920 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
1b930 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b940 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
1b950 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
1b960 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
1b970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b980 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
1b990 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
1b9a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1b9b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b9c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
1b9d0 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
1b9e0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
1b9f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1ba00 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1ba10 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
1ba20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1ba30 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
1ba40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1ba50 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
1ba60 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1ba70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ba80 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1ba90 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1baa0 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
1bab0 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
1bac0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1bad0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1bae0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
1baf0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
1bb00 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
1bb10 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
1bb20 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
1bb30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bb40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bb50 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1bb60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1bb70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1bb80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1bb90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1bba0 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
1bbb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1bbc0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
1bbd0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
1bbe0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
1bbf0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
1bc00 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
1bc10 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
1bc20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
1bc30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1bc40 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
1bc50 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1bc60 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1bc70 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
1bc80 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
1bc90 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
1bca0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
1bcb0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
1bcc0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
1bcd0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
1bce0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1bcf0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1bd00 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1bd10 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1bd20 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1bd30 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1bd40 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1bd50 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1bd60 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1bd70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1bd80 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1bd90 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1bda0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1bdb0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1bdc0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1bdd0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1bde0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50     if( pCur->apP
1bdf0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
1be00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1be10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1be20 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
1be30 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1be40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1be50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1be60 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
1be70 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
1be80 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
1be90 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
1bea0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
1beb0 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  f, 0, 0);.  }.  
1bec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bed0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1bee0 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
1bef0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
1bf00 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
1bf10 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
1bf20 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
1bf30 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
1bf40 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
1bf50 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
1bf60 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
1bf70 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1bf80 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
1bf90 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
1bfa0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
1bfb0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
1bfc0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
1bfd0 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
1bfe0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
1bff0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
1c000 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c010 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
1c020 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
1c030 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
1c040 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
1c050 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
1c060 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1c070 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
1c080 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1c090 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
1c0a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
1c0b0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1c0c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1c0d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1c0e0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1c0f0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1c100 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1c110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c120 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c130 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1c140 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
1c150 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1c160 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1c170 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1c180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c190 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1c1a0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1c1b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1c1c0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1c1d0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
1c1e0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1c1f0 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30   amt, pBuf, 1, 0
1c200 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c210 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1c220 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1c230 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1c240 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
1c250 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
1c260 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1c270 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
1c280 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
1c290 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1c2a0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
1c2b0 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
1c2c0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
1c2d0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
1c2e0 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
1c2f0 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
1c300 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
1c310 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
1c320 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
1c330 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
1c340 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
1c350 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
1c360 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
1c370 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
1c380 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c390 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
1c3a0 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
1c3b0 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
1c3c0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
1c3d0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
1c3e0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
1c3f0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
1c400 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
1c410 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
1c420 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
1c430 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
1c440 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
1c450 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
1c460 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
1c470 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
1c480 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
1c490 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
1c4a0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
1c4b0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
1c4c0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
1c4d0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
1c4e0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
1c4f0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
1c500 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
1c510 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
1c520 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
1c530 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
1c540 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
1c550 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
1c560 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1c570 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
1c580 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
1c590 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
1c5a0 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
1c5b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1c5c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
1c5d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c5e0 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
1c5f0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1c600 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1c610 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1c620 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1c630 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
1c640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1c650 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
1c660 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
1c670 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
1c680 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
1c690 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
1c6a0 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
1c6b0 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
1c6c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1c6d0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
1c6e0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
1c6f0 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
1c700 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
1c710 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
1c720 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1c730 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1c740 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
1c750 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1c760 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1c770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1c780 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c790 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
1c7a0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1c7b0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
1c7c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1c7d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1c7e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1c7f0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1c800 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
1c810 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
1c820 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
1c830 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
1c840 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
1c850 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
1c860 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
1c870 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28  se{.    nKey = (
1c880 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
1c890 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
1c8a0 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
1c8b0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
1c8c0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1c8d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1c8e0 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
1c8f0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1c900 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1c910 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
1c920 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
1c930 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
1c940 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
1c950 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
1c960 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
1c970 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
1c980 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
1c990 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
1c9a0 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
1c9b0 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
1c9c0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
1c9d0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
1c9e0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
1c9f0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
1ca00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1ca10 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
1ca20 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
1ca30 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1ca40 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
1ca50 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
1ca60 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
1ca70 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
1ca80 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
1ca90 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
1caa0 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
1cab0 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
1cac0 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
1cad0 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
1cae0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
1caf0 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
1cb00 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
1cb10 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
1cb20 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
1cb30 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
1cb40 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
1cb50 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
1cb60 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
1cb70 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
1cb80 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
1cb90 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
1cba0 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
1cbb0 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
1cbc0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
1cbd0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1cbe0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1cbf0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1cc00 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1cc10 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1cc20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1cc30 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1cc40 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1cc50 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1cc60 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
1cc70 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
1cc80 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1cc90 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
1cca0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1ccb0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
1ccc0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1ccd0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1cce0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1ccf0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1cd00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1cd10 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
1cd20 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
1cd30 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
1cd40 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
1cd50 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1cd60 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
1cd70 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
1cd80 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
1cd90 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
1cda0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1cdb0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
1cdc0 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve to..*/.static
1cdd0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
1cde0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1cdf0 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
1ce00 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
1ce10 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1ce20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
1ce30 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
1ce40 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1ce50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1ce60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1ce70 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1ce80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ce90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1cea0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1ceb0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
1cec0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28  X_DEPTH );.  if(
1ced0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
1cee0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
1cef0 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
1cf00 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1cf10 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
1cf20 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
1cf30 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
1cf40 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66  &pNewPage);.  if
1cf50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1cf60 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
1cf70 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
1cf80 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
1cf90 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
1cfa0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
1cfb0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1cfc0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1cfd0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
1cfe0 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
1cff0 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <1 ){.    return
1d000 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d010 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1d020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d030 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1d040 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
1d050 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
1d060 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
1d070 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
1d080 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
1d090 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
1d0a0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
1d0b0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
1d0c0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
1d0d0 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
1d0e0 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
1d0f0 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
1d100 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
1d110 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
1d120 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
1d130 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
1d140 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
1d150 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
1d160 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1d170 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1d180 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
1d190 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
1d1a0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73  o iChild){.  ass
1d1b0 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
1d1c0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
1d1d0 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
1d1e0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
1d1f0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
1d200 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
1d210 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
1d220 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
1d230 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1d240 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
1d250 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
1d260 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
1d270 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
1d280 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
1d290 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
1d2a0 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
1d2b0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1d2c0 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
1d2d0 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
1d2e0 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
1d2f0 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
1d300 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
1d310 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
1d320 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
1d330 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
1d340 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
1d350 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
1d360 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
1d370 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
1d380 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
1d390 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
1d3a0 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
1d3b0 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
1d3c0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
1d3d0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
1d3e0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
1d3f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d400 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1d410 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1d420 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1d430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d440 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
1d450 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1d460 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1d470 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
1d480 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
1d490 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1d4a0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
1d4b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d4c0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
1d4d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1d4e0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
1d4f0 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  .  );.  releaseP
1d500 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1d510 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
1d520 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
1d530 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1d540 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1d550 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1d560 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1d570 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1d580 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61  root page.*/.sta
1d590 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
1d5a0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
1d5b0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
1d5c0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
1d5d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
1d5e0 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
1d5f0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
1d600 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1d610 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1d620 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d630 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1d640 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
1d650 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1d660 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
1d670 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
1d680 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
1d690 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
1d6a0 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
1d6b0 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
1d6c0 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
1d6d0 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
1d6e0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1d6f0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1d700 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d710 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72  FAULT ){.      r
1d720 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
1d730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1d740 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1d750 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
1d760 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1d770 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e>=0 ){.    int 
1d780 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
1d790 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1d7a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1d7b0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1d7c0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
1d7d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1d7e0 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
1d7f0 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49  K!=(rc = getAndI
1d800 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
1d810 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
1d820 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a  ur->apPage[0])).
1d830 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75      ){.      pCu
1d840 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1d850 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1d860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d870 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f 74 20   }.  }..  pRoot 
1d880 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
1d890 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
1d8a0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
1d8b0 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 70 43  pgnoRoot );.  pC
1d8c0 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
1d8d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
1d8e0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
1d8f0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1d900 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
1d910 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1d920 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ey = 0;..  if( p
1d930 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
1d940 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
1d950 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
1d960 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge;.    assert( 
1d970 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pRoot->pgno==1 )
1d980 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
1d990 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
1d9a0 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
1d9b0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1d9c0 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65   assert( subpage
1d9d0 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 );.    pCur->
1d9e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1d9f0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
1da00 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1da10 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
1da20 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
1da30 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d  State = ((pRoot-
1da40 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52  >nCell>0)?CURSOR
1da50 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e  _VALID:CURSOR_IN
1da60 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65  VALID);.  }.  re
1da70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1da80 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1da90 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
1daa0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
1dab0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1dac0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
1dad0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1dae0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
1daf0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
1db00 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
1db10 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
1db20 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
1db30 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
1db40 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1db50 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
1db60 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
1db70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
1db80 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
1db90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
1dba0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1dbb0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1dbc0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1dbd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1dbe0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1dbf0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
1dc00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1dc10 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
1dc20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1dc30 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
1dc40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1dc50 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1dc60 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1dc70 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
1dc80 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1dc90 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
1dca0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1dcb0 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
1dcc0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1dcd0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
1dce0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dcf0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1dd00 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
1dd10 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
1dd20 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1dd30 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
1dd40 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
1dd50 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
1dd60 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
1dd70 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
1dd80 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
1dd90 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1dda0 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
1ddb0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1ddc0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
1ddd0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
1dde0 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
1ddf0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
1de00 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
1de10 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
1de20 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
1de30 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
1de40 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
1de50 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1de60 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
1de70 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
1de80 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1de90 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1dea0 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
1deb0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1dec0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1ded0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1dee0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
1def0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
1df00 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1df10 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1df20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1df30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1df40 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1df50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1df60 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
1df70 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1df80 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
1df90 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1dfa0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1dfb0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1dfc0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
1dfd0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1dfe0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
1dff0 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
1e000 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1e010 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
1e020 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e030 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
1e040 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1e050 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1e060 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1e070 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1e080 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1e090 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1e0a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1e0b0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1e0c0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1e0d0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1e0e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1e0f0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1e100 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1e110 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1e120 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1e130 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1e140 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1e150 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1e160 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1e170 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1e180 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1e190 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1e1a0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1e1b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e1c0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1e1d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1e1e0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1e1f0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1e200 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1e210 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1e220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e230 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1e240 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1e250 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1e260 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1e270 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e280 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
1e290 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1e2a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e2b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1e2c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e2d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e2e0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
1e2f0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1e300 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1e310 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1e320 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1e330 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e340 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1e350 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
1e360 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1e370 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1e380 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1e390 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1e3a0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1e3b0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1e3c0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1e3d0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1e3e0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1e3f0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1e400 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1e410 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1e420 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1e430 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
1e440 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e450 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e460 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e470 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1e480 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1e490 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1e4a0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1e4b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1e4d0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1e4e0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1e4f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e500 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e510 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
1e520 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
1e530 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
1e540 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e550 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e560 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e570 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1e580 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1e590 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1e5a0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1e5b0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1e5c0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
1e5d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a  c==SQLITE_OK ?1:
1e5e0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1e5f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1e600 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1e610 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1e620 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
1e630 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
1e640 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
1e650 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
1e660 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1e670 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1e680 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1e690 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
1e6a0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
1e6b0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
1e6c0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
1e6d0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
1e6e0 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
1e6f0 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
1e700 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
1e710 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1e720 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1e730 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1e740 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1e750 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1e760 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1e770 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1e780 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1e790 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1e7a0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1e7b0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1e7c0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1e7d0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1e7e0 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
1e7f0 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
1e800 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
1e810 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
1e820 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
1e830 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
1e840 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1e850 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
1e860 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
1e870 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
1e880 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
1e890 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
1e8a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1e8b0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
1e8c0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1e8d0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1e8e0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1e8f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e900 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
1e910 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
1e920 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
1e930 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
1e960 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
1e970 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
1e980 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
1e990 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
1e9a0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1e9b0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1e9c0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1e9d0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
1e9e0 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
1e9f0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
1ea00 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1ea10 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1ea20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1ea30 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1ea40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ea50 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1ea60 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
1ea70 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
1ea80 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1ea90 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
1eaa0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
1eab0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1eac0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
1ead0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1eae0 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
1eaf0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1eb00 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
1eb10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1eb20 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
1eb30 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
1eb40 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
1eb50 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
1eb60 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
1eb70 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
1eb80 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
1eb90 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1eba0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
1ebb0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1ebc0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1ebd0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1ebe0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1ebf0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ec00 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1ec10 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1ec20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1ec30 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
1ec40 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
1ec50 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
1ec60 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
1ec70 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
1ec80 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
1ec90 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
1eca0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
1ecb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1ecc0 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
1ecd0 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70  lidNKey .   && p
1ece0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
1ecf0 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
1ed00 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1ed10 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
1ed20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1ed30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ed40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1ed50 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c     if( pCur->atL
1ed60 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  ast && pCur->inf
1ed70 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
1ed80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
1ed90 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1eda0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1edb0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
1edc0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1edd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1ede0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1edf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1ee00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1ee10 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
1ee20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1ee30 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
1ee40 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1ee50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1ee60 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
1ee70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
1ee80 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1ee90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1eea0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1eeb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1eec0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1eed0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
1eee0 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  ->intKey || pIdx
1eef0 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
1ef00 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
1ef10 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  pr;.    Pgno chl
1ef20 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
1ef30 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
1ef40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ef50 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ge];.    int c =
1ef60 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65   -1;  /* pRes re
1ef70 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73  turn if table is
1ef80 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d   empty must be -
1ef90 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30  1 */.    lwr = 0
1efa0 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
1efb0 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
1efc0 69 66 28 20 28 21 70 50 61 67 65 2d 3e 69 6e 74  if( (!pPage->int
1efd0 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d  Key && pIdxKey==
1efe0 30 29 20 7c 7c 20 75 70 72 3c 30 20 29 7b 0a 20  0) || upr<0 ){. 
1eff0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f000 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f010 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1f020 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
1f030 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74     if( biasRight
1f040 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1f050 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1f060 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20  e] = (u16)upr;. 
1f070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f080 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1f090 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
1f0a0 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20  ((upr+lwr)/2);. 
1f0b0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29     }.    for(;;)
1f0c0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43  {.      void *pC
1f0d0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36  ellKey;.      i6
1f0e0 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
1f0f0 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
1f100 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1f110 61 67 65 5d 3b 0a 20 20 20 20 20 20 70 43 75 72  age];.      pCur
1f120 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1f130 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
1f140 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
1f150 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1f160 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
1f170 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
1f180 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
1f190 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
1f1a0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1f1b0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1f1c0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1f1d0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1f1e0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1f1f0 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1f200 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1f210 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
1f220 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
1f230 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
1f240 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
1f250 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
1f260 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
1f270 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
1f280 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f290 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
1f2a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1f2b0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1f2c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
1f2d0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  sert( nCellKey>i
1f2e0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
1f2f0 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20     c = +1;.     
1f300 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1f310 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76  {.        int av
1f320 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ailable;.       
1f330 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69   pCellKey = (voi
1f340 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  d *)fetchPayload
1f350 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c  (pCur, &availabl
1f360 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e  e, 0);.        n
1f370 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e  CellKey = pCur->
1f380 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
1f390 20 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65     if( available
1f3a0 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20  >=nCellKey ){.  
1f3b0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1f3c0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1f3d0 70 61 72 65 28 28 69 6e 74 29 6e 43 65 6c 6c 4b  pare((int)nCellK
1f3e0 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ey, pCellKey, pI
1f3f0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
1f400 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f410 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
1f420 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
1f430 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20  nCellKey );.    
1f440 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
1f450 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
1f460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f470 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1f480 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1f490 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
1f4a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1f4b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
1f4c0 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
1f4d0 29 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64  )nCellKey, (void
1f4e0 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
1f4f0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
1f500 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1f510 61 72 65 28 28 69 6e 74 29 6e 43 65 6c 6c 4b 65  are((int)nCellKe
1f520 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  y, pCellKey, pId
1f530 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
1f540 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1f550 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1f560 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
1f570 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1f580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f590 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
1f5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1f5b0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
1f5c0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
1f5d0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1f5e0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
1f5f0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
1f600 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
1f610 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20      upr = lwr - 
1f620 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1f630 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1f640 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
1f650 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
1f660 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1f670 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1f680 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1f690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f6a0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
1f6b0 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
1f6c0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
1f6d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
1f6e0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
1f6f0 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
1f700 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  upr ){.        p
1f710 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
1f720 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1f730 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1f740 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  }.      pCur->ai
1f750 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f760 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70   = (u16)((lwr+up
1f770 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
1f780 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
1f790 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
1f7a0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1f7b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1f7c0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1f7d0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
1f7e0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1f7f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1f800 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1f810 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1f820 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1f830 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1f840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
1f850 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
1f860 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
1f870 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
1f880 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
1f890 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f8a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f8b0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1f8c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f8d0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1f8e0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
1f8f0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
1f900 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f910 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1f920 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
1f930 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1f940 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
1f950 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  6)lwr;.    pCur-
1f960 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1f970 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1f980 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
1f990 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1f9a0 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
1f9b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1f9c0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1f9d0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
1f9e0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
1f9f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
1fa00 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
1fa10 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
1fa20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
1fa30 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
1fa40 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
1fa50 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1fa60 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
1fa70 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
1fa80 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
1fa90 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
1faa0 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
1fab0 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ork..*/.int sqli
1fac0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a  te3BtreeMoveto(.
1fad0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1fae0 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
1faf0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
1fb00 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
1fb10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1fb20 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
1fb30 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
1fb40 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
1fb50 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
1fb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
1fb70 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
1fb80 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
1fb90 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
1fba0 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
1fbb0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
1fbc0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
1fbd0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
1fbe0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
1fbf0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
1fc00 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
1fc10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
1fc40 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1fc50 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
1fc60 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
1fc70 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1fc80 65 64 52 65 63 6f 72 64 20 61 53 70 61 63 65 5b  edRecord aSpace[
1fc90 31 36 5d 3b 20 2f 2a 20 54 65 6d 70 20 73 70 61  16]; /* Temp spa
1fca0 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d  ce for pIdxKey -
1fcb0 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c   to avoid a mall
1fcc0 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65  oc */..  if( pKe
1fcd0 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
1fce0 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74   nKey==(i64)(int
1fcf0 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64  )nKey );.    pId
1fd00 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
1fd10 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
1fd20 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
1fd30 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a  int)nKey, pKey,.
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd60 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69        aSpace, si
1fd70 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20  zeof(aSpace));. 
1fd80 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
1fd90 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1fda0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
1fdb0 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  {.    pIdxKey = 
1fdc0 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  0;.  }.  rc = sq
1fdd0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
1fde0 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70  Unpacked(pCur, p
1fdf0 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69  IdxKey, nKey, bi
1fe00 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28  as, pRes);.  if(
1fe10 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c   pKey ){.    sql
1fe20 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
1fe30 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64  packedRecord(pId
1fe40 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  xKey);.  }.  ret
1fe50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1fe60 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1fe70 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1fe80 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
1fe90 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
1fea0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
1feb0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1fec0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
1fed0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
1fee0 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
1fef0 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
1ff00 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
1ff10 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
1ff20 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
1ff30 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
1ff40 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
1ff50 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
1ff60 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1ff70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ff80 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
1ff90 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
1ffa0 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
1ffb0 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
1ffc0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1ffd0 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
1ffe0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
1fff0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
20000 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
20010 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
20020 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
20030 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
20040 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
20050 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
20060 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
20070 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
20080 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
20090 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
200a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
200b0 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63  n handle for a c
200c0 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ursor..*/.sqlite
200d0 33 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43  3 *sqlite3BtreeC
200e0 75 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74  ursorDb(const Bt
200f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
20100 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20110 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
20120 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
20130 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
20140 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
20150 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  b;.}../*.** Adva
20160 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
20170 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
20180 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
20190 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
201a0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
201b0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
201c0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
201d0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
201e0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
201f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
20200 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
20210 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
20220 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
20230 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
20240 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
20250 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
20260 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
20270 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
20280 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
20290 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
202a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
202b0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
202c0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
202d0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
202e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
202f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20300 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  }.  assert( pRes
20310 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52  !=0 );.  if( CUR
20320 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
20330 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
20340 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
20350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
20370 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20  ->skip>0 ){.    
20380 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
20390 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
203a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
203b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
203c0 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50  >skip = 0;..  pP
203d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
203e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
203f0 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
20400 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20410 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
20420 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
20430 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70    assert( idx<=p
20440 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
20450 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
20460 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
20470 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
20480 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
20490 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
204a0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
204b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
204c0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
204d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
204e0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
204f0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
20500 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20510 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
20520 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
20530 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
20540 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
20550 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
20560 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
20570 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
20580 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
20590 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
205a0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
205b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
205c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
205d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
205e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
205f0 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
20600 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
20610 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
20620 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
20630 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
20640 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20650 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
20660 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  l );.    *pRes =
20670 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
20680 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
20690 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
206a0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
206b0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
206c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
206d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
206e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
206f0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
20700 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
20710 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
20720 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
20730 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
20740 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
20750 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
20760 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
20770 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
20780 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
20790 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
207a0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
207b0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
207c0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
207d0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
207e0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
207f0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
20800 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
20810 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
20820 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
20830 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
20840 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
20850 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
20860 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
20870 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
20880 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
20890 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
208a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
208b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
208c0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
208d0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
208e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
208f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
20900 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
20910 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
20920 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
20930 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
20940 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
20950 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
20960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20970 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
20980 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
20990 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
209a0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
209b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
209c0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
209d0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
209e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
209f0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
20a00 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
20a10 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
20a20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
20a30 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
20a40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
20a50 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
20a60 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
20a70 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
20a80 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
20a90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
20aa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20ab0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
20ac0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
20ad0 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
20ae0 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
20af0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20b00 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
20b10 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
20b20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
20b30 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
20b40 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
20b50 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
20b60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20b70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
20b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
20b90 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
20ba0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
20bb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
20bc0 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
20bd0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
20be0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
20bf0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
20c00 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
20c10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20c20 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
20c30 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
20c40 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
20c50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20c60 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
20c70 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
20c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
20c90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20ca0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20    }.  }.  *pRes 
20cb0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
20cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
20cd0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
20ce0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
20cf0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
20d00 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
20d10 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
20d20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
20d30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20d40 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
20d50 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
20d60 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
20d70 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
20d80 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
20d90 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
20da0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
20db0 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
20dc0 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
20dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
20de0 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
20df0 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
20e00 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
20e10 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20e20 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
20e30 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
20e40 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
20e50 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
20e60 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
20e70 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
20e80 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
20e90 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
20ea0 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
20eb0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
20ec0 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
20ed0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
20ee0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
20ef0 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
20f00 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
20f10 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f   a (feeble) effo
20f20 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
20f30 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
20f40 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
20f50 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
20f60 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
20f70 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
20f80 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
20f90 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
20fa0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
20fb0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20fc0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
20fd0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
20fe0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
20ff0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
21000 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72   the "exact" par
21010 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
21020 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75   and the page-nu
21030 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73  mber nearby exis
21040 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  ts .** anywhere 
21050 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
21060 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
21070 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  renteed to be re
21080 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
21090 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
210a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
210b0 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63  bases when alloc
210c0 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
210d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
210e0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
210f0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
21100 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20  pBt, .  MemPage 
21110 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e  **ppPage, .  Pgn
21120 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e  o *pPgno, .  Pgn
21130 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65  o nearby,.  u8 e
21140 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  xact.){.  MemPag
21150 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
21160 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20   rc;.  int n;   
21170 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
21180 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
21190 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b  list */.  int k;
211a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
211b0 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
211c0 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
211d0 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
211e0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
211f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
21200 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73  Trunk = 0;..  as
21210 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21220 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
21230 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31  tex) );.  pPage1
21240 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
21250 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
21260 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
21270 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  ]);.  if( n>0 ){
21280 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
21290 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
212a0 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
212b0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
212c0 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
212d0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
212e0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
212f0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
21300 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
21310 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
21320 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
21330 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70  If the 'exact' p
21340 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75  arameter was tru
21350 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  e and a query of
21360 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
21370 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
21380 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
21390 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
213a0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
213b0 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
213c0 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
213d0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
213e0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
213f0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
21400 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21410 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78  ACUUM.    if( ex
21420 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 70  act && nearby<=p
21430 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
21440 74 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  t) ){.      u8 e
21450 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
21460 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
21470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
21480 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
21490 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
214a0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
214b0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
214c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
214d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
214e0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
214f0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
21500 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
21510 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
21520 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
21530 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
21540 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
21550 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
21560 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
21570 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
21580 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
21590 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
215a0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
215b0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
215c0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
215d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
215e0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
215f0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
21600 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
21610 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
21620 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
21630 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
21640 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
21650 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
21660 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
21670 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
21680 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
21690 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
216a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
216b0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
216c0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
216d0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
216e0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
216f0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
21700 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
21710 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
21720 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
21730 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
21740 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
21750 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
21760 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
21770 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
21780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21790 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
217a0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
217b0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
217c0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
217d0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
217e0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
217f0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
21800 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
21810 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
21820 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
21830 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
21840 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
21850 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
21860 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
21870 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
21880 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
21890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
218a0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
218b0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
218c0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
218d0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
218e0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
218f0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
21900 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
21910 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
21920 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
21930 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
21940 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
21950 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
21960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21970 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
21980 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21990 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
219a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
219b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
219c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
219d0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
219e0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
219f0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
21a00 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
21a10 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
21a20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
21a30 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
21a40 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
21a50 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
21a60 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
21a70 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
21a80 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
21a90 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
21aa0 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61  e if( k>pBt->usa
21ab0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
21ac0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
21ad0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
21ae0 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
21af0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
21b00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21b10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21b20 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
21b30 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
21b40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21b50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21b60 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21b70 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
21b80 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
21b90 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
21ba0 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
21bb0 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
21bc0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
21bd0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
21be0 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
21bf0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
21c00 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
21c10 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
21c20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
21c30 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
21c40 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
21c50 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
21c60 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
21c70 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
21c80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
21c90 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
21ca0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
21cb0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
21cc0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
21cd0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
21ce0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
21cf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21d00 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
21d10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
21d20 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
21d30 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
21d40 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
21d50 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21d60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
21d70 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
21d80 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
21d90 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
21da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
21db0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21dc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
21dd0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
21de0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
21df0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
21e00 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
21e10 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
21e20 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
21e30 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
21e40 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
21e50 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
21e60 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
21e70 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
21e80 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
21e90 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
21ea0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
21eb0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
21ec0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
21ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21ee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
21ef0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
21f00 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
21f10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
21f20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21f40 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
21f50 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
21f60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
21f70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
21f80 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
21f90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21fa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21fb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21fc0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21fd0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
21fe0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
21ff0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
22000 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22010 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
22020 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
22030 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
22040 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
22050 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
22060 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
22070 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
22080 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
22090 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
220a0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
220b0 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
220c0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
220d0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
220e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
220f0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
22100 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22110 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
22120 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
22130 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
22140 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
22150 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
22160 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
22170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
22180 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22190 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
221a0 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
221b0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
221c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
221d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
221e0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
221f0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
22200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22210 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
22220 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
22230 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
22240 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
22260 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
22270 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
22280 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
22290 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
222a0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
222b0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
222c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
222d0 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
222e0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
222f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
22300 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
22310 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
22320 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
22330 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
22340 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
22350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22360 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
22370 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22380 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
22390 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
223a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
223b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
223c0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
223d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
223e0 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
223f0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
22400 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
22410 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
22420 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
22430 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
22440 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
22450 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
22460 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
22470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
22480 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
22490 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
224a0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
224b0 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
224c0 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
224d0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
224e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
224f0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
22510 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
22520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22530 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
22540 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
22550 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
22560 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
22570 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
22580 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
22590 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
225a0 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
225b0 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
225c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
225d0 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
225e0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20    Pgno nPage;.  
225f0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
22600 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
22610 20 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50    nPage = pagerP
22620 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
22630 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50           if( *pP
22640 67 6e 6f 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20  gno>nPage ){.   
22650 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
22660 20 70 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e   page off the en
22670 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
22680 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22690 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
226a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
226b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
226c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
226d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
226e0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
226f0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
22700 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
22710 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
22720 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
22730 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
22760 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
22770 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
22780 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
22790 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
227a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
227b0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
227c0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
227d0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
227e0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
227f0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
22800 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  1);.          as
22810 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
22820 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
22830 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29  runk->pDbPage) )
22840 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
22850 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
22860 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
22870 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20   *pPgno);.      
22880 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22890 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
228a0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
228b0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
228c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
228d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
228e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
228f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
22900 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
22910 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
22920 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22940 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22950 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
22960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22970 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
22980 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
22990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
229a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
229b0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
229c0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
229d0 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
229e0 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
229f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
22a00 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
22a10 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
22a20 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
22a30 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
22a40 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
22a50 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
22a60 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61   nPage = pagerPa
22a70 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
22a80 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65    *pPgno = nPage
22a90 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a   + 1;..    if( *
22aa0 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
22ab0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
22ac0 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
22ad0 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  +;.    }..#ifnde
22ae0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
22af0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
22b00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
22b10 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
22b20 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29  E(pBt, *pPgno) )
22b30 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
22b40 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
22b50 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
22b60 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
22b70 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
22b80 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
22b90 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
22ba0 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
22bb0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
22bc0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
22bd0 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
22be0 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
22bf0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
22c00 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
22c10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
22c20 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
22c30 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
22c40 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
22c50 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
22c60 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
22c70 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20  , *pPgno));.    
22c80 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
22c90 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
22ca0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
22cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22cc0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
22cd0 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29  *pPgno, &pPg, 0)
22ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22cf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22d00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22d10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
22d20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
22d30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22d40 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
22d50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
22d60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28 2a 70  rn rc;.      (*p
22d70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Pgno)++;.      i
22d80 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
22d90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
22da0 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b  ) ){ (*pPgno)++;
22db0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
22dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
22dd0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
22de0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
22df0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
22e00 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22e10 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
22e20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
22e30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
22e40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22e50 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
22e60 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
22e70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22e80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
22e90 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
22ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
22eb0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
22ec0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
22ed0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
22ee0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
22ef0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
22f00 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
22f10 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
22f20 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
22f30 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
22f40 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
22f50 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  runk);.  if( rc=
22f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22f70 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
22f80 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
22f90 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
22fa0 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
22fb0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
22fc0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
22fd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
22fe0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
22ff0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
23000 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
23010 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23020 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
23030 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61  s used to add pa
23040 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20  ge iPage to the 
23050 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
23060 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20  ee-list. .** It 
23070 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
23080 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
23090 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f  already a part o
230a0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  f the free-list.
230b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
230c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
230d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
230e0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
230f0 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20  is optional..** 
23100 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  If the caller ha
23110 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20  ppens to have a 
23120 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
23130 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a  emPage object .*
23140 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
23150 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61  to page iPage ha
23160 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ndy, it may pass
23170 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e   it as the secon
23180 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68  d value. .** Oth
23190 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70  erwise, it may p
231a0 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ass NULL..**.** 
231b0 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  If a pointer to 
231c0 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  a MemPage object
231d0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
231e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
231f0 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65  t,.** its refere
23200 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74  nce count is not
23210 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73   altered by this
23220 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
23230 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
23240 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  e2(BtShared *pBt
23250 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50  , MemPage *pMemP
23260 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29  age, Pgno iPage)
23270 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  {.  MemPage *pTr
23280 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
23290 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d          /* Free-
232a0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
232b0 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  */.  Pgno iTrunk
232c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
232d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
232e0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
232f0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
23300 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  */ .  MemPage *p
23310 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
23320 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ge1;      /* Loc
23330 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
23340 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50  page 1 */.  MemP
23350 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23370 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72  /* Page being fr
23380 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  eed. May be NULL
23390 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
233c0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
233d0 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
23400 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
23410 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
23420 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23430 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
23440 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
23450 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a  ert( iPage>1 );.
23460 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
23470 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
23480 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
23490 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
234a0 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
234b0 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
234c0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
234d0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
234e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
234f0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
23500 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
23510 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
23520 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
23530 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
23540 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
23550 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
23560 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
23570 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
23580 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
23590 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
235a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
235b0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
235c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
235d0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
235e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
235f0 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
23600 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   If the SQLITE_S
23610 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d  ECURE_DELETE com
23620 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
23630 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
23640 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75  n.  ** always fu
23650 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
23660 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
23670 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
23680 2a 2f 0a 20 20 69 66 28 20 28 21 70 50 61 67 65  */.  if( (!pPage
23690 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
236a0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
236b0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
236c0 2c 20 30 29 29 29 0a 20 20 20 7c 7c 20 20 20 20  , 0))).   ||    
236d0 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 73 71          (rc = sq
236e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
236f0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
23700 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  .  ){.    goto f
23710 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
23720 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d  .  memset(pPage-
23730 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
23740 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
23750 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
23760 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
23770 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
23780 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
23790 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
237a0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
237b0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
237c0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
237d0 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
237e0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63  VACUUM ){.    rc
237f0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
23800 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
23810 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20  FREEPAGE, 0);.  
23820 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
23830 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
23840 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
23850 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
23860 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
23870 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
23880 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
23890 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
238a0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
238b0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
238c0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
238d0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
238e0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
238f0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
23900 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
23910 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
23920 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
23930 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
23940 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
23950 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
23960 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
23970 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
23980 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
23990 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
239a0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
239b0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
239c0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
239d0 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
239e0 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
239f0 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
23a00 20 69 6e 74 20 6e 4c 65 61 66 3b 20 20 20 20 20   int nLeaf;     
23a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23a20 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
23a30 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
23a40 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
23a50 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
23a60 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
23a70 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
23a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
23a90 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
23aa0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
23ab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23ac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
23ad0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
23ae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
23af0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
23b00 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
23b10 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 30  .    if( nLeaf<0
23b20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23b30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23b40 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
23b50 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
23b60 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
23b70 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  <pBt->usableSize
23b80 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
23b90 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
23ba0 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
23bb0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
23bc0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
23bd0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
23be0 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
23bf0 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
23c00 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
23c10 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
23c20 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
23c30 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
23c40 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
23c50 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
23c60 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
23c70 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
23c80 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
23c90 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
23ca0 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
23cb0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
23cc0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
23cd0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
23ce0 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
23cf0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
23d00 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
23d10 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
23d20 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
23d30 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
23d40 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
23d50 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
23d60 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
23d70 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
23d80 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
23d90 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
23da0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
23db0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
23dc0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  we will contain 
23dd0 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
23de0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
23df0 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
23e00 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
23e10 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
23e20 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
23e30 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
23e40 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
23e50 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
23e60 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
23e70 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
23e80 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
23e90 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
23ea0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
23eb0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
23ec0 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
23ed0 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
23ee0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
23ef0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23f00 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
23f10 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
23f20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23f30 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
23f40 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
23f50 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
23f60 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
23f70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
23f80 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
23f90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23fa0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
23fb0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
23fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23fd0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
23fe0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
23ff0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  e);.        }.#e
24000 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63 20  ndif.        rc 
24010 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
24020 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
24030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24040 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
24050 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
24060 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
24070 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
24080 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
24090 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
240a0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
240b0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
240c0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
240d0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
240e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
240f0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
24100 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
24110 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
24120 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
24130 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
24140 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
24150 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
24160 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
24170 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
24180 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
24190 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
241a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
241b0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
241c0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
241d0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
241e0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
241f0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
24200 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
24210 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
24220 20 20 28 28 21 70 50 61 67 65 29 20 26 26 20 28    ((!pPage) && (
24230 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
24240 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
24250 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
24260 65 2c 20 30 29 29 29 29 0a 20 20 20 20 20 7c 7c  e, 0)))).     ||
24270 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
24280 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24290 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 29  Page->pDbPage)))
242a0 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  .  ){.    goto f
242b0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
242c0 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
242d0 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
242e0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
242f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
24300 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
24310 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
24320 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
24330 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
24340 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
24350 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
24360 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
24370 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
24380 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
24390 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
243a0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
243b0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
243c0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
243d0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
243e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
243f0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
24400 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
24410 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 72 65  e){.  return fre
24420 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
24430 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
24440 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pgno);.}../*.**
24450 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
24460 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
24470 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
24480 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
24490 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
244a0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
244b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
244c0 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
244d0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
244e0 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
244f0 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
24500 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
24510 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
24520 20 75 31 36 20 6f 76 66 6c 50 61 67 65 53 69 7a   u16 ovflPageSiz
24530 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
24540 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24550 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
24560 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
24570 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
24580 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
24590 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
245a0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
245b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
245c0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
245d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
245e0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
245f0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
24600 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
24610 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
24620 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
24630 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
24640 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
24650 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
24660 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
24670 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
24680 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
24690 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
246a0 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
246b0 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
246c0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
246d0 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
246e0 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
246f0 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
24700 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
24710 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
24720 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
24730 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f  ovflPgno==0 || o
24740 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67  vflPgno>pagerPag
24750 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
24760 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24770 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
24790 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
247a0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
247b0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
247c0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
247d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
247e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
247f0 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65   }.    rc = free
24800 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
24810 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
24820 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
24830 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24840 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
24850 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
24860 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
24870 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
24880 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
24890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
248a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
248b0 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
248c0 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
248d0 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
248e0 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
248f0 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
24900 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
24910 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
24920 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
24930 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
24940 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
24950 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
24960 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
24970 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
24980 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
24990 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
249a0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
249b0 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
249c0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
249d0 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
249e0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
249f0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
24a00 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
24a10 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
24a20 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
24a30 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
24a40 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
24a50 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
24a60 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
24a70 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
24a80 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
24a90 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
24aa0 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
24ab0 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
24ac0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24ad0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24ae0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
24af0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
24b00 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
24b10 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
24b20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
24b30 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
24b40 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
24b50 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
24b60 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
24b70 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
24b80 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
24b90 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
24ba0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ata */.  int nZe
24bb0 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
24bc0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
24bd0 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61   zero bytes to a
24be0 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a  ppend to pData *
24bf0 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
24c20 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
24c30 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
24c40 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
24c50 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
24c60 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63  , rc;.  int spac
24c70 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
24c80 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d   *pOvfl = 0;.  M
24c90 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
24ca0 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  se = 0;.  unsign
24cb0 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
24cc0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
24cd0 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
24ce0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
24cf0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
24d00 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
24d10 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20   int nHeader;.  
24d20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
24d30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24d40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
24d50 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
24d60 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
24d70 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
24d80 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
24d90 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
24da0 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
24db0 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
24dc0 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
24dd0 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
24de0 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
24df0 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
24e00 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
24e10 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
24e20 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
24e30 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
24e40 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
24e50 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
24e60 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
24e70 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
24e80 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
24e90 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61   = 0;.  if( !pPa
24ea0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
24eb0 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20  nHeader += 4;.  
24ec0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  }.  if( pPage->h
24ed0 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48  asData ){.    nH
24ee0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
24ef0 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
24f00 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  r], nData+nZero)
24f10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
24f20 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30  Data = nZero = 0
24f30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
24f40 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
24f50 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
24f60 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73  u64*)&nKey);.  s
24f70 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
24f80 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
24f90 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
24fa0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
24fb0 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
24fc0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
24fd0 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
24fe0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
24ff0 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
25000 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
25010 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
25020 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
25030 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
25040 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
25050 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
25060 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
25070 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
25080 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
25090 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
250a0 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66   nKey>0x7fffffff
250b0 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20   || pKey==0 ){. 
250c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
250d0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
250e0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  }.    nPayload +
250f0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
25100 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
25110 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
25120 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
25130 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
25140 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
25150 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
25160 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
25170 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
25180 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
25190 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
251a0 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
251b0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
251c0 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
251d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
251e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
251f0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
25200 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
25210 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
25220 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
25230 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
25240 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
25250 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
25260 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
25270 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
25280 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
25290 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
252a0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
252b0 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
252c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
252d0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
252e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
252f0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
25300 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
25310 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
25320 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
25330 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
25340 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25350 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
25360 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
25370 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
25380 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
25390 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
253a0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
253b0 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
253c0 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
253d0 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
253e0 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
253f0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
25400 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
25410 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
25420 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
25430 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
25440 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
25450 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
25460 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
25470 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
25480 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
25490 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
254a0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
254b0 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
254c0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
254d0 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
254e0 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
254f0 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
25500 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
25510 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
25520 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
25530 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
25540 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
25550 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25560 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
25570 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
25580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25590 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
255a0 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
255b0 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
255c0 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
255d0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
255e0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
255f0 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
25600 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  map);.        if
25610 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
25620 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
25630 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
25640 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25650 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
25660 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
25670 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
25680 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
25690 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
256a0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
256b0 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
256c0 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
256d0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
256e0 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
256f0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
25700 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
25710 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
25720 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
25730 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
25740 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
25750 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
25760 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
25770 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
25780 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
25790 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
257a0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
257b0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
257c0 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
257d0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
257e0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
257f0 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
25800 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
25810 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
25820 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
25830 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
25840 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25850 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
25860 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
25870 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
25880 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
25890 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
258a0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
258b0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
258c0 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
258d0 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
258e0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
258f0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
25900 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
25910 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
25920 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
25930 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
25940 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
25950 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
25960 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
25970 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
25980 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
25990 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
259a0 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
259b0 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
259c0 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
259d0 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
259e0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
259f0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
25a00 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
25a10 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
25a20 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
25a30 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25a40 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
25a50 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
25a60 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
25a70 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
25a80 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
25a90 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
25aa0 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
25ab0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
25ac0 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
25ad0 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
25ae0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
25af0 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
25b00 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
25b10 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
25b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
25b30 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
25b40 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
25b50 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
25b60 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
25b70 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
25b80 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
25b90 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
25ba0 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
25bb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25bc0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
25bd0 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
25be0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
25bf0 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
25c00 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
25c10 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
25c20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
25c30 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
25c40 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
25c50 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
25c60 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
25c70 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
25c80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
25c90 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
25ca0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25cb0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
25cc0 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
25cd0 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
25ce0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
25cf0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
25d00 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
25d10 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
25d20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
25d30 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
25d40 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
25d50 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
25d60 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
25d70 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
25d80 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
25d90 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
25da0 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
25db0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
25dc0 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
25dd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
25de0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
25df0 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65 6c  atic int dropCel
25e00 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
25e10 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
25e20 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
25e30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
25e40 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
25e50 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
25e60 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
25e70 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
25e80 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
25e90 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
25ea0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
25eb0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
25ec0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
25ed0 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
25ee0 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
25ef0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
25f00 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
25f10 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
25f20 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
25f30 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
25f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
25f50 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
25f60 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
25f70 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
25f80 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
25f90 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
25fa0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25fb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
25fc0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
25fd0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
25fe0 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
25ff0 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
26000 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78  llOffset + 2*idx
26010 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
26020 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20 28  te(ptr);.  if( (
26030 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  pc<pPage->hdrOff
26040 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
26050 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c  af?0:4)).     ||
26060 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70   (pc+sz>pPage->p
26070 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20  Bt->usableSize) 
26080 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26090 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
260a0 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  T;.  }.  rc = fr
260b0 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
260c0 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
260d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
260e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
260f0 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  }.  for(i=idx+1;
26100 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
26110 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
26120 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
26130 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
26140 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
26150 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
26160 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
26170 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
26180 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
26190 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
261a0 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72  ee += 2;.  retur
261b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
261c0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
261d0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
261e0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
261f0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
26200 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
26210 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
26220 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
26230 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
26240 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
26250 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
26260 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
26270 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
26280 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
26290 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
262a0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
262b0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
262c0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
262d0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
262e0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
262f0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
26300 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
26310 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
26320 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
26330 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
26340 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
26350 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
26360 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
26370 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
26380 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
26390 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
263a0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
263b0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
263c0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
263d0 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
263e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
263f0 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
26400 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
26410 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
26420 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
26430 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
26440 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
26450 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
26460 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
26470 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
26480 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
26490 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
264a0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
264b0 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
264c0 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
264d0 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
264e0 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  int insertCell(.
264f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26500 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
26510 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
26520 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
26530 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26540 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
26550 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
26560 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
26570 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
26580 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
26590 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
265a0 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
265b0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
265c0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
265d0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
265e0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
265f0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
26600 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
26610 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70  ed */.  u8 nSkip
26620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
26630 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69  not write the fi
26640 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
26650 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  of the cell */.)
26660 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  {.  int idx;    
26670 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
26680 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
26690 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
266a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
266b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
266c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
266d0 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
266e0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
266f0 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  f content for an
26700 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d  y cell in data[]
26710 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
26720 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
26730 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
26740 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
26750 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
26760 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
26770 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
26780 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
26790 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
267a0 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
267b0 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
267c0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61  * Offset into da
267d0 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65  ta[] of the page
267e0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
267f0 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
26800 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
26810 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
26820 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
26830 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
26840 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
26850 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
26860 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
26870 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
26880 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
26890 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
268a0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
268b0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
268c0 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
268d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
268e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
268f0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
26900 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
26910 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
26920 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
26930 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
26940 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
26950 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66  Size(pPage->aOvf
26960 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
26970 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
26980 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
26990 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
269a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
269b0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
269c0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
269d0 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
269e0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
269f0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
26a00 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
26a10 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
26a20 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
26a30 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
26a40 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
26a50 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
26a60 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
26a70 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
26a80 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
26a90 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
26aa0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29  ge->aOvfl[0])) )
26ab0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
26ac0 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
26ad0 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
26ae0 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28  aOvfl[j].idx = (
26af0 75 31 36 29 69 3b 0a 20 20 20 20 70 50 61 67 65  u16)i;.    pPage
26b00 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
26b10 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
26b20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26b30 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
26b40 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
26b50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26b60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26b70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
26b80 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
26b90 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
26ba0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
26bb0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
26bc0 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
26bd0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
26be0 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
26bf0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
26c00 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
26c10 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
26c20 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
26c30 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
26c40 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
26c50 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
26c60 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
26c70 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
26c80 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72   - sz ){.      r
26c90 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
26ca0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
26cb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26cc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
26cd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
26ce0 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74  .      top = get
26cf0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
26d00 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  5]);.      asser
26d10 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74  t( end + sz <= t
26d20 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op );.    }.    
26d30 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  idx = allocateSp
26d40 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a  ace(pPage, sz);.
26d50 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e      assert( idx>
26d60 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
26d70 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65   end <= get2byte
26d80 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
26d90 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b 73 7a  ;.    if (idx+sz
26da0 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
26db0 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20 20  sableSize) {.   
26dc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26dd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
26de0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
26df0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
26e00 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
26e10 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
26e20 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
26e30 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
26e40 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
26e50 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
26e60 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
26e70 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
26e80 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
26e90 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
26ea0 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
26eb0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
26ec0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
26ed0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
26ee0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
26ef0 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  >nCell);.#ifndef
26f00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26f10 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
26f20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
26f30 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
26f40 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
26f50 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
26f60 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
26f70 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
26f80 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
26f90 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
26fa0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
26fb0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
26fc0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
26fd0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
26fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
26ff0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
27000 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
27010 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nfo);.      asse
27020 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
27030 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
27040 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
27050 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
27060 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e       if( (info.n
27070 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
27080 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
27090 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  )>info.nLocal ){
270a0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67  .        Pgno pg
270b0 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
270c0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
270d0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
270e0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
270f0 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  t(pPage->pBt, pg
27100 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
27110 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
27120 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
27130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27140 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
27150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
27160 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
27170 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27180 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
27190 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
271a0 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
271b0 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
271c0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
271d0 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
271e0 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
271f0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
27200 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
27210 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
27220 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
27230 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
27240 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
27250 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
27260 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
27270 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
27280 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
27290 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
272a0 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
272b0 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
272c0 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
272d0 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
272e0 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
272f0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
27300 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
27310 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61  er */.  int tota
27320 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74  lSize;    /* Tot
27330 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
27340 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64  ells */.  int hd
27350 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
27360 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61  ndex of page hea
27370 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
27380 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64  lptr;      /* Ad
27390 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
273a0 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
273b0 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
273c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
273d0 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
273e0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
273f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
27400 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  r the page */.. 
27410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27420 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
27430 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27440 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
27450 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
27460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
27470 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
27480 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
27490 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
274a0 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
274b0 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20   );.  totalSize 
274c0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
274d0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
274e0 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20     totalSize += 
274f0 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20  aSize[i];.  }.  
27500 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a  assert( totalSiz
27510 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  e+2*nCell<=pPage
27520 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73  ->nFree );.  ass
27530 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
27540 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
27550 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
27560 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
27570 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 63  >pDbPage) );.  c
27580 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e  ellptr = pPage->
27590 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61  cellOffset;.  da
275a0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
275b0 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
275c0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70  ->hdrOffset;.  p
275d0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
275e0 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
275f0 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  if( nCell ){.   
27600 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f   cellbody = allo
27610 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
27620 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20   totalSize);.   
27630 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
27640 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  y>0 );.    asser
27650 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t( pPage->nFree 
27660 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  >= 2*nCell );.  
27670 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
27680 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66  = 2*nCell;.    f
27690 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
276a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74   i++){.      put
276b0 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
276c0 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  ptr], cellbody);
276d0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64  .      memcpy(&d
276e0 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61  ata[cellbody], a
276f0 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b  pCell[i], aSize[
27700 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70  i]);.      cellp
27710 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63  tr += 2;.      c
27720 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65  ellbody += aSize
27730 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  [i];.    }.    a
27740 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d  ssert( cellbody=
27750 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
27760 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20  bleSize );.  }. 
27770 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
27780 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
27790 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
277a0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
277b0 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
277c0 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
277d0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
277e0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
277f0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
27800 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
27810 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
27820 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
27830 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
27840 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
27850 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
27860 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
27870 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
27880 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
27890 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
278a0 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
278b0 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
278c0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
278d0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
278e0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
278f0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
27900 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
27910 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
27920 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
27930 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
27940 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
27950 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
27960 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
27970 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
27980 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
27990 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
279a0 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
279b0 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
279c0 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
279d0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
279e0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
279f0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27a10 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
27a20 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
27a30 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
27a40 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
27a50 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
27a60 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
27a70 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
27a80 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
27a90 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
27aa0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
27ab0 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a 0a  Cursor*, int);..
27ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27ad0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
27ae0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
27af0 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
27b00 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
27b10 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
27b20 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
27b30 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
27b40 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
27b50 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
27b60 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
27b70 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
27b80 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
27b90 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
27ba0 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
27bb0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
27bc0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
27bd0 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63  of trying balanc
27be0 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
27bf0 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
27c00 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
27c10 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
27c20 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
27c30 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
27c40 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
27c50 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
27c60 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
27c70 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
27c80 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
27c90 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
27ca0 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
27cb0 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
27cc0 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
27cd0 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
27ce0 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
27cf0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
27d00 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
27d10 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
27d20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
27d30 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
27d40 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
27d50 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
27d60 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
27d70 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
27d80 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
27d90 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
27da0 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
27db0 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
27dc0 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
27dd0 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
27de0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
27df0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
27e00 6b 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  k(BtCursor *pCur
27e10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
27e20 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30  emPage *pNew = 0
27e30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  ;.  Pgno pgnoNew
27e40 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  ;.  u8 *pCell;. 
27e50 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43   u16 szCell;.  C
27e60 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
27e70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
27e80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27e90 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 4d 65  ur->iPage];.  Me
27ea0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d  mPage *pParent =
27eb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27ec0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
27ed0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
27ee0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
27ef0 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50  t parentIdx = pP
27f00 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20  arent->nCell;   
27f10 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64  /* pParent new d
27f20 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65  ivider cell inde
27f30 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  x */.  int paren
27f40 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
27f50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27f60 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20   of new divider 
27f70 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72  cell */.  u8 par
27f80 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20  entCell[64];    
27f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27fa0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
27fb0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
27fc0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
27fd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
27fe0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
27ff0 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ) );..  /* Alloc
28000 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
28010 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
28020 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
28030 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
28040 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
28050 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
28060 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
28070 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
28080 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
28090 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
280a0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
280b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
280c0 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
280d0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
280e0 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65  .    szCell = ce
280f0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
28100 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73   pCell);.    ass
28110 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
28120 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65  rIswriteable(pNe
28130 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  w->pDbPage) );. 
28140 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
28150 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
28160 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  ]);.    assemble
28170 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
28180 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
28190 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
281a0 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a 20 20 20  flow = 0;.  .   
281b0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75 72   /* pPage is cur
281c0 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74  rently the right
281d0 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e  -child of pParen
281e0 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20  t. Change this. 
281f0 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
28200 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73  e right-child is
28210 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c   the new page al
28220 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e  located above an
28230 64 0a 20 20 20 20 2a 2a 20 70 50 61 67 65 20 69  d.    ** pPage i
28240 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69  s the next-to-ri
28250 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 20 20  ght child. .    
28260 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e 6f 72 65  **.    ** Ignore
28270 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
28280 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  e of the call to
28290 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20 66   fillInCell(). f
282a0 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20 20 20  illInCell().    
282b0 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75  ** may only retu
282c0 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  rn other than SQ
282d0 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69 73  LITE_OK if it is
282e0 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 6c   required to all
282f0 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20 6f 6e 65  ocate.    ** one
28300 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
28310 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65 20 61  w pages. Since a
28320 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65  n internal table
28330 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a 20 20   B-Tree cell .  
28340 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72 20 73    ** may never s
28350 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f 20 61  pill over onto a
28360 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
28370 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d 75 6d  (it is a maximum
28380 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31 33 20 62   of .    ** 13 b
28390 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c 20 69  ytes in size), i
283a0 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65 73 73  t is not neccess
283b0 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68 65  ary to check the
283c0 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 20 20   return code..  
283d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69    **.    ** Simi
283e0 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e 73 65 72  larly, the inser
283f0 74 43 65 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e  tCell() function
28400 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20   cannot fail if 
28410 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
28420 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69  being inserted i
28430 6e 74 6f 20 69 73 20 61 6c 72 65 61 64 79 20 77  nto is already w
28440 72 69 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ritable and the 
28450 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 0a 20  cell does not . 
28460 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e     ** contain an
28470 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e 74 65   overflow pointe
28480 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 69  r. So ignore thi
28490 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  s return code to
284a0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  o..    */.    as
284b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
284c0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70 43 65 6c  ll>0 );.    pCel
284d0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
284e0 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
284f0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
28500 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
28510 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
28520 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66 69 6c 6c  &info);.    fill
28530 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
28540 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69  parentCell, 0, i
28550 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
28560 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b  0, &parentSize);
28570 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 72  .    assert( par
28580 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20  entSize<64 );.  
28590 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
285a0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
285b0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
285c0 67 65 29 20 29 3b 0a 20 20 20 20 69 6e 73 65 72  ge) );.    inser
285d0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
285e0 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74  arentIdx, parent
285f0 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65  Cell, parentSize
28600 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 75 74  , 0, 4);.    put
28610 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
28620 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  owCell(pParent,p
28630 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65  arentIdx), pPage
28640 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74  ->pgno);.    put
28650 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
28660 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
28670 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
28680 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
28690 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
286a0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
286b0 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
286c0 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
286d0 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
286e0 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
286f0 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
28700 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
28710 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
28720 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
28730 6f 77 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ow page..    */.
28740 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
28750 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
28760 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
28770 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
28780 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
28790 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
287a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
287b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
287c0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
287d0 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  New, 0);.      }
287e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
287f0 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
28800 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
28810 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
28820 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
28830 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
28840 73 20 70 6f 69 6e 74 20 74 68 65 20 70 50 61 67  s point the pPag
28850 65 2d 3e 6e 46 72 65 65 20 76 61 72 69 61 62 6c  e->nFree variabl
28860 65 20 69 73 20 6e 6f 74 20 73 65 74 20 63 6f 72  e is not set cor
28870 72 65 63 74 6c 79 20 77 69 74 68 0a 20 20 2a 2a  rectly with.  **
28880 20 72 65 73 70 65 63 74 20 74 6f 20 74 68 65 20   respect to the 
28890 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
288a0 61 67 65 20 28 62 65 63 61 75 73 65 20 69 74 20  age (because it 
288b0 77 61 73 20 73 65 74 20 74 6f 20 30 20 62 79 20  was set to 0 by 
288c0 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c  .  ** insertCell
288d0 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ). So call sqlit
288e0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
288f0 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69  ) to make sure i
28900 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72 72 65 63  t is.  ** correc
28910 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  t..  **.  ** Thi
28920 73 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65  s has to be done
28930 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
28940 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
28950 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  ed. Normally, if
28960 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
28970 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 72 65  ccurs during tre
28980 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65  e balancing, the
28990 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d   contents of Mem
289a0 50 61 67 65 20 61 72 65 0a 20 20 2a 2a 20 6e 6f  Page are.  ** no
289b0 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20 61 73 20  t important, as 
289c0 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63  they will be rec
289d0 61 6c 63 75 6c 61 74 65 64 20 77 68 65 6e 20 74  alculated when t
289e0 68 65 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65  he page is rolle
289f0 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 42 75 74  d.  ** back. But
28a00 20 68 65 72 65 2c 20 69 6e 20 62 61 6c 61 6e 63   here, in balanc
28a10 65 5f 71 75 69 63 6b 28 29 2c 20 69 74 20 69 73  e_quick(), it is
28a20 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
28a30 50 61 67 65 20 68 61 73 20 0a 20 20 2a 2a 20 6e  Page has .  ** n
28a40 6f 74 20 79 65 74 20 62 65 65 6e 20 6d 61 72 6b  ot yet been mark
28a50 65 64 20 64 69 72 74 79 20 6f 72 20 77 72 69 74  ed dirty or writ
28a60 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
28a70 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
28a80 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 77 69 6c  fore.  ** it wil
28a90 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  l not be rolled 
28aa0 62 61 63 6b 20 61 6e 64 20 73 6f 20 69 74 20 69  back and so it i
28ab0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6d  s important to m
28ac0 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
28ad0 2a 2a 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ** the page data
28ae0 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73 20 6f 66   and contents of
28af0 20 4d 65 6d 50 61 67 65 20 61 72 65 20 63 6f 6e   MemPage are con
28b00 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
28b10 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
28b20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
28b30 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
28b40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
28b50 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
28b60 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65 72  );..  /* If ever
28b70 79 74 68 69 6e 67 20 65 6c 73 65 20 73 75 63 63  ything else succ
28b80 65 65 64 65 64 2c 20 62 61 6c 61 6e 63 65 20 74  eeded, balance t
28b90 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
28ba0 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65 20 74 68  in .  ** case th
28bb0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  e divider cell i
28bc0 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69  nserted caused i
28bd0 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  t to become over
28be0 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  full..  */.  if(
28bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28c00 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
28c10 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  e(pPage);.    pC
28c20 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20  ur->iPage--;.   
28c30 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
28c40 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  ur, 0);.  }.  re
28c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
28c60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
28c70 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f  _QUICKBALANCE */
28c80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28c90 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
28ca0 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  es Cells on pPag
28cb0 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32  e and up to NN*2
28cc0 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20   siblings.** of 
28cd0 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c  pPage so that al
28ce0 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
28cf0 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75  ut the same amou
28d00 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
28d10 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20  ..** Usually NN 
28d20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
28d30 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
28d40 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20   is used in the 
28d50 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68  balancing,.** th
28d60 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e  ough more siblin
28d70 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
28d80 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70  om one side if p
28d90 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  Page is the firs
28da0 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69  t.** or last chi
28db0 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74  ld of its parent
28dc0 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73 20  .  If pPage has 
28dd0 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20  fewer than 2*NN 
28de0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d  siblings.** (som
28df0 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e  ething which can
28e00 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
28e10 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f  pPage is the roo
28e20 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20  t page or a .** 
28e30 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74  child of root) t
28e40 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
28e50 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69  e siblings parti
28e60 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
28e70 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
28e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
28e90 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d  lings of pPage m
28ea0 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
28eb0 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
28ec0 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20  y one or.** two 
28ed0 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
28ee0 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
28ef0 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
28f00 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f  ver full. The ro
28f10 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70  ot page.** is sp
28f20 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c  ecial and is all
28f30 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c  owed to be nearl
28f40 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67  y empty. If pPag
28f50 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f  e is .** the roo
28f60 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
28f70 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
28f80 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ee might be incr
28f90 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72  eased.** or decr
28fa0 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73  eased by one, as
28fb0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b   necessary, to k
28fc0 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67  eep the root pag
28fd0 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  e from being.** 
28fe0 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70  overfull or comp
28ff0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  letely empty..**
29000 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
29010 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
29020 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
29030 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20  of the Cells on 
29040 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e  pPage.** might n
29050 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
29060 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e  tored in pPage->
29070 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63  aData[].  This c
29080 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
29090 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
290a0 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74  full.  Part of t
290b0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
290c0 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20  outine is to.** 
290d0 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65  make sure all Ce
290e0 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e  lls for pPage on
290f0 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20  ce again fit in 
29100 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a  pPage->aData[]..
29110 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
29120 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
29130 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66   the siblings of
29140 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65   pPage, the pare
29150 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d  nt of pPage.** m
29160 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72  ight become over
29170 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
29180 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70 70  l.  If that happ
29190 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ens, then this r
291a0 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
291b0 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
291c0 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a  on the parent..*
291d0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
291e0 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
291f0 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
29200 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
29210 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
29220 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
29230 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
29240 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
29250 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
29260 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
29270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29280 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
29290 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
292a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
292b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
292c0 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f 72 20 75  /* The over or u
292d0 6e 64 65 72 66 75 6c 6c 20 70 61 67 65 20 74 6f  nderfull page to
292e0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 4d 65   balance */.  Me
292f0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20  mPage *pParent; 
29300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29310 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
29320 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
29330 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
29340 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
29350 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
29360 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20  nt nCell = 0;   
29370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29380 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
29390 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
293a0 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  int nMaxCells = 
293b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
293c0 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
293d0 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  f apCell, szCell
293e0 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e  , aFrom. */.  in
293f0 74 20 6e 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20  t nOld = 0;     
29400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29410 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
29420 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e   apOld[] */.  in
29430 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20  t nNew = 0;     
29440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29450 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
29460 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
29470 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20  t nDiv;         
29480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29490 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
294a0 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e   apDiv[] */.  in
294b0 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20  t i, j, k;      
294c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
294d0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
294e0 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
294f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29500 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20   Index of pPage 
29510 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
29520 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  l[] */.  int nxD
29530 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
29540 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
29550 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
29560 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
29570 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29590 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
295a0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  ode */.  int lea
295b0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
295c0 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
295d0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
295e0 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
295f0 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
29600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29610 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
29620 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
29630 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
29640 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
29650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
29660 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
29670 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
29680 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
29690 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
296a0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
296b0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
296c0 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
296e0 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
296f0 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
29700 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
29710 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
29720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29730 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
29740 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
29750 20 20 69 6e 74 20 69 53 70 61 63 65 32 20 3d 20    int iSpace2 = 
29760 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
29770 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
29780 79 74 65 20 6f 66 20 61 53 70 61 63 65 32 5b 5d  yte of aSpace2[]
29790 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
297a0 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
297b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
297c0 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
297d0 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
297e0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
297f0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
29800 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
29810 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67  siblings */.  Pg
29820 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20  no pgnoOld[NB]; 
29830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
29840 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
29850 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c  ach page in apOl
29860 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  d[] */.  MemPage
29870 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
29880 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
29890 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
298a0 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
298b0 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
298c0 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
298d0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
298e0 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
298f0 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50  balancing */.  P
29900 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32  gno pgnoNew[NB+2
29910 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ];          /* P
29920 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
29930 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e  each page in apN
29940 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70  ew[] */.  u8 *ap
29950 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Div[NB];        
29960 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
29970 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
29980 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
29990 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
299a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
299b0 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
299c0 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
299d0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
299e0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
299f0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
29a00 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
29a10 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
29a20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
29a30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29a40 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
29a50 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
29a60 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
29a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a80 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
29a90 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
29aa0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
29ab0 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  aCopy[NB];      
29ac0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
29ad0 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20  holding data of 
29ae0 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38  apCopy[] */.  u8
29af0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
29b00 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
29b10 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  r copies of divi
29b20 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f 72  ders cells befor
29b30 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75  e balance */.  u
29b40 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30 3b 20  8 *aSpace2 = 0; 
29b50 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
29b60 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69 76 69  or overflow divi
29b70 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74 65 72  ders cells after
29b80 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38   balance */.  u8
29b90 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20 20   *aFrom = 0;..  
29ba0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
29bb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29bc0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ];.  assert( sql
29bd0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
29be0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
29bf0 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  x) );.  VVA_ONLY
29c00 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75  ( pCur->pagesShu
29c10 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 0a 20 20  ffled = 1 );..  
29c20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68  /* .  ** Find th
29c30 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
29c40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
29c50 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
29c60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29c70 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
29c80 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
29c90 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
29ca0 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20 70  e->pDbPage) || p
29cb0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
29cc0 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  =1 );.  pBt = pP
29cd0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72  age->pBt;.  pPar
29ce0 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  ent = pCur->apPa
29cf0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
29d00 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
29d10 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51  rent );.  if( SQ
29d20 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
29d30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29d40 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
29d50 65 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  e)) ){.    goto 
29d60 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
29d70 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 28 28 22  .  }..  TRACE(("
29d80 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
29d90 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
29da0 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
29db0 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
29dc0 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  o));..#ifndef SQ
29dd0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
29de0 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  ALANCE.  /*.  **
29df0 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a   A special case:
29e00 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79    If a new entry
29e10 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69   has just been i
29e20 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20  nserted into a. 
29e30 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20   ** table (that 
29e40 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68  is, a btree with
29e50 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e   integer keys an
29e60 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68  d all data at th
29e70 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61  e leaves).  ** a
29e80 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  nd the new entry
29e90 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
29ea0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
29eb0 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65  tree (it has the
29ec0 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65  .  ** largest ke
29ed0 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  y) then use the 
29ee0 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f  special balance_
29ef0 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  quick() routine 
29f00 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69  for.  ** balanci
29f10 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69  ng.  balance_qui
29f20 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73  ck() is much fas
29f30 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20  ter and results 
29f40 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a  in a tighter.  *
29f50 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74  * packing of dat
29f60 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  a in the common 
29f70 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
29f80 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a   pPage->leaf &&.
29f90 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
29fa0 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61  Key &&.      pPa
29fb0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
29fc0 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
29fd0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
29fe0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20  Page->nCell &&. 
29ff0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 67       pParent->pg
2a000 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67  no!=1 &&.      g
2a010 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
2a020 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2a030 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
2a040 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b  pPage->pgno.  ){
2a050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a060 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
2a070 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    /*.    ** TODO
2a080 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c  : Check the sibl
2a090 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ings to the left
2a0a0 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61   of pPage. It ma
2a0b0 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  y be that.    **
2a0c0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75   they are not fu
2a0d0 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61  ll and no new pa
2a0e0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ge is required..
2a0f0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
2a100 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  n balance_quick(
2a110 70 43 75 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pCur);.  }.#endi
2a120 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  f..  if( SQLITE_
2a130 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
2a140 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2a150 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  e->pDbPage)) ){.
2a160 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2a170 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
2a180 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
2a190 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
2a1a0 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
2a1b0 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
2a1c0 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
2a1d0 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
2a1e0 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
2a1f0 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
2a200 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
2a210 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
2a220 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
2a230 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
2a240 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
2a250 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 64 78  Cell .  */.  idx
2a260 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2a270 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20  Cur->iPage-1];. 
2a280 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
2a290 65 78 28 70 50 61 72 65 6e 74 2c 20 69 64 78 2c  ex(pParent, idx,
2a2a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a   pPage->pgno);..
2a2b0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73    /*.  ** Find s
2a2c0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
2a2d0 70 50 61 67 65 20 61 6e 64 20 74 68 65 20 63 65  pPage and the ce
2a2e0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74  lls in pParent t
2a2f0 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20  hat divide.  ** 
2a300 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41  the siblings.  A
2a310 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
2a320 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
2a330 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a  lings on either.
2a340 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61    ** side of pPa
2a350 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e  ge.  More siblin
2a360 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
2a370 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
2a380 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61  ver, if.  ** pPa
2a390 67 65 20 74 68 65 72 65 20 61 72 65 20 66 65 77  ge there are few
2a3a0 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69  er than NN sibli
2a3b0 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ngs on the other
2a3c0 20 73 69 64 65 2e 20 20 49 66 20 70 50 61 72 65   side.  If pPare
2a3d0 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2a3e0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2a3f0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2a400 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2a410 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20  e taken..  */.  
2a420 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e  nxDiv = idx - NN
2a430 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20  ;.  if( nxDiv + 
2a440 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43  NB > pParent->nC
2a450 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  ell ){.    nxDiv
2a460 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
2a470 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a  l - NB + 1;.  }.
2a480 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b    if( nxDiv<0 ){
2a490 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a  .    nxDiv = 0;.
2a4a0 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a    }.  nDiv = 0;.
2a4b0 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44    for(i=0, k=nxD
2a4c0 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b  iv; i<NB; i++, k
2a4d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70  ++){.    if( k<p
2a4e0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
2a4f0 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2a500 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
2a510 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44  nt, k);.      nD
2a520 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  iv++;.      asse
2a530 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65  rt( !pParent->le
2a540 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  af );.      pgno
2a550 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
2a560 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
2a570 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50   }else if( k==pP
2a580 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2a590 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
2a5a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2a5b0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2a5c0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2a5d0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2a5e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a5f0 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  }.    rc = getAn
2a600 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2a610 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c  gnoOld[i], &apOl
2a620 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
2a630 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
2a640 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 2f 2a  _cleanup;.    /*
2a650 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61   apOld[i]->idxPa
2a660 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a 20 20 20  rent = k; */.   
2a670 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a   apCopy[i] = 0;.
2a680 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
2a690 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b  Old );.    nOld+
2a6a0 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73  +;.    nMaxCells
2a6b0 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
2a6c0 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
2a6d0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a  nOverflow;.  }..
2a6e0 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
2a6f0 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
2a700 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
2a710 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
2a720 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
2a730 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
2a740 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
2a750 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
2a760 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2a770 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
2a780 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72  res.  */.  szScr
2a790 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
2a7a0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2a7b0 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
2a7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
2a7d0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
2a7e0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
2a7f0 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
2a800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
2a810 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52  ell */.     + (R
2a820 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
2a830 50 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67 65  Page))+pBt->page
2a840 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f  Size)*NB  /* aCo
2a850 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  py */.     + pBt
2a860 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a880 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
2a890 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49  ce1 */.     + (I
2a8a0 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d  SAUTOVACUUM ? nM
2a8b0 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20  axCells : 0);   
2a8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72            /* aFr
2a8d0 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  om */.  apCell =
2a8e0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
2a8f0 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
2a900 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
2a910 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
2a920 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a930 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2a940 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
2a950 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
2a960 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
2a970 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28  ;.  aCopy[0] = (
2a980 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
2a990 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
2a9a0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2a9b0 47 4e 4d 45 4e 54 28 61 43 6f 70 79 5b 30 5d 29  GNMENT(aCopy[0])
2a9c0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
2a9d0 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  <NB; i++){.    a
2a9e0 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79  Copy[i] = &aCopy
2a9f0 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  [i-1][pBt->pageS
2aa00 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
2aa10 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
2aa20 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
2aa30 79 5b 69 5d 20 2d 20 28 75 38 2a 29 30 29 20 26  y[i] - (u8*)0) &
2aa40 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
2aa50 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
2aa60 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  quired */.  }.  
2aa70 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79  aSpace1 = &aCopy
2aa80 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  [NB-1][pBt->page
2aa90 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
2aaa0 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
2aab0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2aac0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53  YTE_ALIGNMENT(aS
2aad0 70 61 63 65 31 29 20 29 3b 0a 20 20 69 66 28 20  pace1) );.  if( 
2aae0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2aaf0 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70      aFrom = &aSp
2ab00 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69  ace1[pBt->pageSi
2ab10 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70 61 63  ze];.  }.  aSpac
2ab20 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e2 = sqlite3Page
2ab30 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65  Malloc(pBt->page
2ab40 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53 70  Size);.  if( aSp
2ab50 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ace2==0 ){.    r
2ab60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2ab70 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
2ab80 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2ab90 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b    .  /*.  ** Mak
2aba0 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
2abb0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65  content of pPage
2abc0 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
2abd0 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20  s into aOld[].. 
2abe0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
2abf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2ac00 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
2ac10 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
2ac20 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  er.  ** that the
2ac30 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2ac40 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
2ac50 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
2ac60 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f   in the.  ** pro
2ac70 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
2ac80 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  erwritten..  */.
2ac90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
2aca0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
2acb0 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79  Page *p = apCopy
2acc0 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
2acd0 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65  aCopy[i];.    me
2ace0 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d  mcpy(p, apOld[i]
2acf0 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  , sizeof(MemPage
2ad00 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61  ));.    p->aData
2ad10 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b   = (void*)&p[1];
2ad20 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61  .    memcpy(p->a
2ad30 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
2ad40 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
2ad50 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
2ad60 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74  .  ** Load point
2ad70 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73  ers to all cells
2ad80 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65   on sibling page
2ad90 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  s and the divide
2ada0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
2adb0 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65  o the local apCe
2adc0 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b  ll[] array.  Mak
2add0 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
2ade0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
2adf0 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  ** into space ob
2ae00 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61  tained form aSpa
2ae10 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ce1[] and remove
2ae20 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
2ae30 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
2ae40 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
2ae50 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
2ae60 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
2ae70 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
2ae80 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
2ae90 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
2aea0 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
2aeb0 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
2aec0 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
2aed0 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
2aee0 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e   into aSpace1[].
2aef0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
2af00 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2af10 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
2af20 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
2af30 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
2af40 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
2af50 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
2af60 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
2af70 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
2af80 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
2af90 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
2afa0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
2afb0 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
2afc0 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
2afd0 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
2afe0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
2aff0 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
2b000 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
2b010 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
2b020 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
2b030 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
2b040 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
2b050 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
2b060 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
2b070 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
2b080 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
2b090 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 68 61  Data = pPage->ha
2b0a0 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30  sData;.  for(i=0
2b0b0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
2b0c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
2b0d0 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
2b0e0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
2b0f0 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
2b100 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
2b110 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
2b120 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
2b130 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
2b140 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
2b150 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
2b160 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2b170 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
2b180 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
2b190 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
2b1a0 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
2b1b0 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  ;.      if( ISAU
2b1c0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2b1d0 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20      int a;.     
2b1e0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
2b1f0 3d 20 28 75 38 29 69 3b 20 20 20 61 73 73 65 72  = (u8)i;   asser
2b200 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 36 20 29  t( i>=0 && i<6 )
2b210 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d  ;.        for(a=
2b220 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72  0; a<pOld->nOver
2b230 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20  flow; a++){.    
2b240 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
2b250 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d  aOvfl[a].pCell==
2b260 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b  apCell[nCell] ){
2b270 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72  .            aFr
2b280 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
2b290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2b2a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2b2b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b2c0 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b   }.      nCell++
2b2d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2b2e0 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20  i<nOld-1 ){.    
2b2f0 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53    u16 sz = cellS
2b300 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2b310 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2b320 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2b330 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68  .        /* With
2b340 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c   the LEAFDATA fl
2b350 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c  ag, pParent cell
2b360 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b  s hold only INTK
2b370 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  EYs that.       
2b380 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74   ** are duplicat
2b390 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68  es of keys on th
2b3a0 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20  e child pages.  
2b3b0 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76  We need to remov
2b3c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
2b3d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
2b3e0 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74  rom pParent, but
2b3f0 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63 65   the dividers ce
2b400 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  lls are not.    
2b410 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
2b420 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65  apCell[] because
2b430 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69 63   they are duplic
2b440 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65  ates of child ce
2b450 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lls..        */.
2b460 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
2b470 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2b480 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   sz);.      }els
2b490 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  e{.        u8 *p
2b4a0 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  Temp;.        as
2b4b0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
2b4c0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
2b4d0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2b4e0 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65   sz;.        pTe
2b4f0 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53  mp = &aSpace1[iS
2b500 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 20 20  pace1];.        
2b510 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
2b520 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2b530 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
2b540 2f 34 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  /4 );.        as
2b550 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70  sert( iSpace1<=p
2b560 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
2b570 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
2b580 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Temp, apDiv[i], 
2b590 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  sz);.        apC
2b5a0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
2b5b0 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
2b5c0 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  n;.        if( I
2b5d0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2b5e0 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
2b5f0 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
2b600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b610 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
2b620 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
2b630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2b640 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2b650 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  || leafCorrectio
2b660 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
2b670 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d  szCell[nCell] -=
2b680 20 28 75 31 36 29 6c 65 61 66 43 6f 72 72 65 63   (u16)leafCorrec
2b690 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  tion;.        as
2b6a0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70  sert( get4byte(p
2b6b0 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69  Temp)==pgnoOld[i
2b6c0 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ] );.        if(
2b6d0 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
2b6e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2b6f0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2b700 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2b710 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
2b720 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
2b730 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
2b740 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
2b750 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
2b760 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
2b770 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
2b780 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
2b790 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
2b7a0 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72  >aData[pOld->hdr
2b7b0 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20  Offset+8], 4);. 
2b7c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b7d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b7e0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2b7f0 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  4 );.          i
2b800 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  f( szCell[nCell]
2b810 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
2b820 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
2b830 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
2b840 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
2b850 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
2b860 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2b870 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
2b880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b890 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
2b8a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2b8b0 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
2b8c0 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
2b8d0 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
2b8e0 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
2b8f0 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
2b900 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
2b910 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
2b920 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
2b930 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
2b940 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
2b950 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
2b960 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
2b970 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2b980 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
2b990 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
2b9a0 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
2b9b0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
2b9c0 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
2b9d0 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
2b9e0 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
2b9f0 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
2ba00 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
2ba10 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
2ba20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
2ba30 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2ba40 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
2ba50 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
2ba60 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
2ba70 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
2ba80 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
2ba90 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
2baa0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
2bab0 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
2bac0 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
2bad0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
2bae0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
2baf0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
2bb00 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
2bb10 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
2bb20 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
2bb30 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
2bb40 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
2bb50 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
2bb60 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
2bb70 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
2bb80 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
2bb90 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
2bba0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
2bbb0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
2bbc0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
2bbd0 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
2bbe0 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
2bbf0 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
2bc00 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
2bc10 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
2bc20 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
2bc30 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
2bc40 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
2bc50 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
2bc60 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
2bc70 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
2bc80 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
2bc90 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
2bca0 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
2bcb0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
2bcc0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
2bcd0 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
2bce0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
2bcf0 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
2bd00 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
2bd10 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
2bd20 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
2bd30 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
2bd40 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
2bd50 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
2bd60 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
2bd70 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
2bd80 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
2bd90 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
2bda0 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
2bdb0 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
2bdc0 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
2bdd0 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
2bde0 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
2bdf0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
2be00 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
2be10 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
2be20 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
2be30 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
2be40 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
2be50 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
2be60 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
2be70 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
2be80 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
2be90 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
2bea0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
2beb0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
2bec0 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
2bed0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
2bee0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
2bef0 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
2bf00 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
2bf10 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
2bf20 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
2bf30 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
2bf40 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
2bf50 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
2bf60 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
2bf70 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
2bf80 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2bf90 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
2bfa0 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
2bfb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2bfd0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
2bfe0 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
2bff0 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
2c000 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
2c010 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
2c020 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
2c030 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
2c040 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
2c050 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
2c060 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2c070 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
2c080 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a  =0 || szRight+sz
2c090 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66  Cell[d]+2<=szLef
2c0a0 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20  t-(szCell[r]+2) 
2c0b0 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
2c0c0 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
2c0d0 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
2c0e0 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
2c0f0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
2c100 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
2c110 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
2c120 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
2c130 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
2c140 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
2c150 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
2c160 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
2c170 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
2c180 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
2c190 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
2c1a0 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
2c1b0 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20  or we are the.  
2c1c0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  ** a virtual roo
2c1d0 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75  t page.  A virtu
2c1e0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
2c1f0 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f  when the real ro
2c200 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20  ot.  ** page is 
2c210 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72  page 1 and we ar
2c220 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  e the only child
2c230 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20   of that page.. 
2c240 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e   */.  assert( cn
2c250 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
2c260 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
2c270 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
2c280 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  ==0) );..  /*.  
2c290 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
2c2a0 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
2c2b0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
2c2c0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
2c2d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c2e0 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65  pgno>1 );.  page
2c2f0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61  Flags = pPage->a
2c300 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
2c310 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
2c320 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2c330 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
2c340 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
2c350 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
2c360 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  d[i];.      pgno
2c370 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64  New[i] = pgnoOld
2c380 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
2c390 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
2c3a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c3b0 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
2c3c0 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
2c3d0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
2c3e0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2c3f0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
2c400 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2c410 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
2c420 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2c430 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
2c440 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70  , &pgnoNew[i], p
2c450 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b  gnoNew[i-1], 0);
2c460 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2c470 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2c480 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
2c490 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
2c4a0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d     nNew++;.    }
2c4b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
2c4c0 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
2c4d0 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
2c4e0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
2c4f0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
2c500 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20  <nOld ){.    rc 
2c510 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64  = freePage(apOld
2c520 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
2c530 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2c540 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
2c550 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
2c560 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
2c570 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
2c580 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
2c590 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
2c5a0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
2c5b0 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
2c5c0 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
2c5d0 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
2c5e0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
2c5f0 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
2c600 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
2c610 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
2c620 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
2c630 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
2c640 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
2c650 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
2c660 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
2c670 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
2c680 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
2c690 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
2c6a0 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
2c6b0 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
2c6c0 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
2c6d0 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
2c6e0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
2c6f0 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
2c700 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
2c710 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
2c720 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
2c730 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
2c740 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
2c750 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
2c760 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
2c770 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
2c780 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
2c790 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
2c7a0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2c7b0 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
2c7c0 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f   int minV = pgno
2c7d0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  New[i];.    int 
2c7e0 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f  minI = i;.    fo
2c7f0 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b  r(j=i+1; j<k; j+
2c800 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67  +){.      if( pg
2c810 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e  noNew[j]<(unsign
2c820 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20  ed)minV ){.     
2c830 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20     minI = j;.   
2c840 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f       minV = pgno
2c850 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  New[j];.      }.
2c860 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
2c870 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
2c880 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
2c890 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
2c8a0 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
2c8b0 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
2c8c0 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
2c8d0 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69  [i] = pgnoNew[mi
2c8e0 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
2c8f0 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
2c900 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
2c910 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20  [minI] = t;.    
2c920 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
2c930 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
2c940 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2c950 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
2c960 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
2c970 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
2c980 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
2c990 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20  pgnoOld[0], .   
2c9a0 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f   nOld>=2 ? pgnoO
2c9b0 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ld[1] : 0,.    n
2c9c0 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=3 ? pgnoOld
2c9d0 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e  [2] : 0,.    pgn
2c9e0 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30  oNew[0], szNew[0
2c9f0 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
2ca00 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c   pgnoNew[1] : 0,
2ca10 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
2ca20 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
2ca30 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32  w>=3 ? pgnoNew[2
2ca40 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  ] : 0, nNew>=3 ?
2ca50 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
2ca60 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e     nNew>=4 ? pgn
2ca70 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[3] : 0, nNe
2ca80 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
2ca90 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
2caa0 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20   ? pgnoNew[4] : 
2cab0 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
2cac0 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
2cad0 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
2cae0 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
2caf0 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
2cb00 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
2cb10 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
2cb20 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
2cb30 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
2cb40 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
2cb50 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
2cb60 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
2cb70 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
2cb80 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
2cb90 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
2cba0 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
2cbb0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
2cbc0 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
2cbd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2cbe0 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e  New->pgno==pgnoN
2cbf0 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72  ew[i] );.    zer
2cc00 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65  oPage(pNew, page
2cc10 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65  Flags);.    asse
2cc20 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63  mblePage(pNew, c
2cc30 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43  ntNew[i]-j, &apC
2cc40 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b  ell[j], &szCell[
2cc50 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j]);.    assert(
2cc60 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c   pNew->nCell>0 |
2cc70 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e  | (nNew==1 && cn
2cc80 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20  tNew[0]==0) );. 
2cc90 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2cca0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2ccb0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2ccc0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2ccd0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2cce0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
2ccf0 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
2cd00 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
2cd10 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68   the siblings th
2cd20 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67  at were rearrang
2cd30 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65  ed. These can be
2cd40 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68  : left.    ** ch
2cd50 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c  ildren of cells,
2cd60 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
2cd70 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72   of the page, or
2cd80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
2cd90 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74      ** pointed t
2cda0 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20  o by cells..    
2cdb0 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2cdc0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2cdd0 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e   for(k=j; k<cntN
2cde0 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ew[i]; k++){.   
2cdf0 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
2ce00 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2ce10 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d      if( aFrom[k]
2ce20 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79  ==0xFF || apCopy
2ce30 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f  [aFrom[k]]->pgno
2ce40 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a  !=pNew->pgno ){.
2ce50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2ce60 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65  trmapPutOvfl(pNe
2ce70 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20  w, k-j);.       
2ce80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ce90 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 6f 72 72  E_OK && leafCorr
2cea0 65 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  ection==0 ){.   
2ceb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
2cec0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
2ced0 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 6b 5d 29  4byte(apCell[k])
2cee0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2cef0 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  pNew->pgno);.   
2cf00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cf10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cf20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2cf30 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2cf40 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2cf50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2cf60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2cf70 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
2cf80 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2cf90 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
2cfa0 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
2cfb0 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
2cfc0 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
2cfd0 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
2cfe0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2cff0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2d000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2d010 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43  i<nNew-1 && j<nC
2d020 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
2d030 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
2d040 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
2d050 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
2d060 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
2d070 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
2d080 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
2d090 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
2d0a0 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
2d0b0 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
2d0c0 20 3d 20 26 61 53 70 61 63 65 32 5b 69 53 70 61   = &aSpace2[iSpa
2d0d0 63 65 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ce2];.      if( 
2d0e0 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
2d0f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2d100 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
2d110 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
2d120 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2d130 55 4d 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  UM .         && 
2d140 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20  (aFrom[j]==0xFF 
2d150 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
2d160 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  j]]->pgno!=pNew-
2d170 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  >pgno).        )
2d180 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2d190 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2d1a0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
2d1b0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2d1c0 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  New->pgno);.    
2d1d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d1e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d1f0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2d200 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2d210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d220 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2d230 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
2d240 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2d250 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
2d260 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
2d270 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
2d280 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
2d290 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
2d2a0 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
2d2b0 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
2d2c0 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
2d2d0 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
2d2e0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
2d2f0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
2d300 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
2d310 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
2d320 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
2d330 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
2d340 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
2d350 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d360 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2d370 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
2d380 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
2d390 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2d3a0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
2d3b0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
2d3c0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2d3d0 20 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c         rc = fill
2d3e0 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
2d3f0 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  pCell, 0, info.n
2d400 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73  Key, 0, 0, 0, &s
2d410 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
2d420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d430 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2d440 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2d450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d460 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20     pTemp = 0;.  
2d470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d480 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20     pCell -= 4;. 
2d490 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72         /* Obscur
2d4a0 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c  e case for non-l
2d4b0 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20  eaf-data trees: 
2d4c0 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70  If the cell at p
2d4d0 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20  Cell was.       
2d4e0 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73   ** previously s
2d4f0 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20  tored on a leaf 
2d500 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65  node, and its re
2d510 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20  ported size was 
2d520 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  4.        ** byt
2d530 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  es, then it may 
2d540 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c  actually be smal
2d550 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20  ler than this . 
2d560 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73         ** (see s
2d570 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
2d580 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74  CellPtr(), 4 byt
2d590 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  es is the minimu
2d5a0 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20  m size of.      
2d5b0 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20    ** any cell). 
2d5c0 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74  But it is import
2d5d0 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20  ant to pass the 
2d5e0 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20  correct size to 
2d5f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65  .        ** inse
2d600 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70  rtCell(), so rep
2d610 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f  arse the cell no
2d620 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  w..        **.  
2d630 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
2d640 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65  at this can neve
2d650 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53  r happen in an S
2d660 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c  QLite data file,
2d670 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20   as all.        
2d680 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20  ** cells are at 
2d690 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49  least 4 bytes. I
2d6a0 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  t only happens i
2d6b0 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20  n b-trees used. 
2d6c0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61         ** to eva
2d6d0 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43  luate "IN (SELEC
2d6e0 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69  T ...)" and simi
2d6f0 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20  lar clauses..   
2d700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d710 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34  if( szCell[j]==4
2d720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
2d730 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74  sert(leafCorrect
2d740 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20  ion==4);.       
2d750 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
2d760 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65  Ptr(pParent, pCe
2d770 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
2d780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 70       }.      iSp
2d790 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace2 += sz;.    
2d7a0 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
2d7b0 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b  t->pageSize/4 );
2d7c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2d7d0 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67  Space2<=pBt->pag
2d7e0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72  eSize );.      r
2d7f0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2d800 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
2d810 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
2d820 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   4);.      if( r
2d830 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2d840 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2d850 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nup;.      asser
2d860 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2d870 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2d880 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2d890 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
2d8a0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2d8b0 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20  pParent,nxDiv), 
2d8c0 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  pNew->pgno);..  
2d8d0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2d8e0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2d8f0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e   database, and n
2d900 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  ot a leaf-data t
2d910 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ree,.      ** th
2d920 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  en update the po
2d930 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61  inter map with a
2d940 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
2d950 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
2d960 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
2d970 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74  cell just insert
2d980 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66  ed points to (if
2d990 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
2d9a0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
2d9b0 56 41 43 55 55 4d 20 26 26 20 21 6c 65 61 66 44  VACUUM && !leafD
2d9c0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
2d9d0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2d9e0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2d9f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2da00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2da10 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
2da20 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2da30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2da40 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  }.      j++;.   
2da50 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
2da60 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
2da70 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2da80 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  try for the new 
2da90 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
2daa0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2dab0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
2dac0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2dad0 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
2dae0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2daf0 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  rent->pgno);.   
2db00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2db10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2db20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2db30 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  anup;.      }.  
2db40 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
2db50 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
2db60 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
2db70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
2db80 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
2db90 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
2dba0 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
2dbb0 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
2dbc0 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
2dbd0 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
2dbe0 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
2dbf0 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
2dc00 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 4);.    if( IS
2dc10 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2dc20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2dc30 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ut(pBt, get4byte
2dc40 28 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d 41 50  (zChild), PTRMAP
2dc50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e  _BTREE, apNew[nN
2dc60 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20  ew-1]->pgno);.  
2dc70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2dc80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2dc90 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2dca0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20  eanup;.      }. 
2dcb0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2dcc0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2dcd0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2dce0 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2dcf0 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61    if( nxDiv==pPa
2dd00 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72  rent->nCell+pPar
2dd10 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
2dd20 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
2dd30 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
2dd40 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  he right-most ch
2dd50 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a  ild of pParent *
2dd60 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
2dd70 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2dd80 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2dd90 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  t+8], pgnoNew[nN
2dda0 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  ew-1]);.  }else{
2ddb0 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
2ddc0 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
2ddd0 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20  e left child of 
2dde0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2ddf0 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a  in pParent.    *
2de00 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74  * past the right
2de10 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e  -most divider en
2de20 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  try */.    put4b
2de30 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
2de40 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
2de50 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  Div), pgnoNew[nN
2de60 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ew-1]);.  }..  /
2de70 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74  *.  ** Balance t
2de80 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
2de90 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
2dea0 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  urrent page (pPa
2deb0 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68  ge) might.  ** h
2dec0 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74  ave been added t
2ded0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 73  o the freelist s
2dee0 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f  o it might no lo
2def0 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c 69  nger be initiali
2df00 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  zed..  ** But th
2df10 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 69  e parent page wi
2df20 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 69  ll always be ini
2df30 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
2df40 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
2df50 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 73 71  ->isInit );.  sq
2df60 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
2df70 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70 43 65  (apCell);.  apCe
2df80 6c 6c 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 28  ll = 0;.  TRACE(
2df90 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
2dfa0 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64  hed with %d: old
2dfb0 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
2dfc0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2dfd0 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e    pPage->pgno, n
2dfe0 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
2dff0 29 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ));.  pPage->nOv
2e000 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 72 65  erflow = 0;.  re
2e010 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2e020 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  ;.  pCur->iPage-
2e030 2d 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  -;.  rc = balanc
2e040 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 0a 20  e(pCur, 0);.  . 
2e050 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
2e060 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2e070 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
2e080 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
2e090 65 33 50 61 67 65 46 72 65 65 28 61 53 70 61 63  e3PageFree(aSpac
2e0a0 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  e2);.  sqlite3Sc
2e0b0 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
2e0c0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2e0d0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
2e0e0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
2e0f0 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
2e100 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2e110 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2e120 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
2e130 20 7d 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67   }.  pCur->apPag
2e140 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2e150 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
2e160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e170 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e180 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
2e190 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2e1a0 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74  f a btree when t
2e1b0 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
2e1c0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
2e1d0 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  s.  This is an o
2e1e0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61  pportunity to ma
2e1f0 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73  ke the tree.** s
2e200 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20  hallower by one 
2e210 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
2e220 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61   int balance_sha
2e230 6c 6c 6f 77 65 72 28 42 74 43 75 72 73 6f 72 20  llower(BtCursor 
2e240 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2e250 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
2e260 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
2e270 61 67 65 20 6f 66 20 42 2d 54 72 65 65 20 2a 2f  age of B-Tree */
2e280 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
2e290 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2e2a0 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c  /* The only chil
2e2b0 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20  d page of pPage 
2e2c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
2e2d0 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
2e2e0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2e2f0 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20   for pChild */. 
2e300 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e310 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
2e320 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
2e330 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
2e340 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
2e350 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
2e360 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2e370 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72 65   BTree structure
2e380 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c   */.  int mxCell
2e390 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20 20  PerPage;        
2e3a0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
2e3b0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65  mber of cells pe
2e3c0 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  r page */.  u8 *
2e3d0 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *apCell;        
2e3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
2e3f0 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73  cells from pages
2e400 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20   being balanced 
2e410 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
2e420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e430 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
2e440 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
2e450 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2e460 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 70  >iPage==0 );.  p
2e470 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2e480 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72  age[0];..  asser
2e490 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2e4a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2e4b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2e4c0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2e4d0 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20 3d  utex) );.  pBt =
2e4e0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d   pPage->pBt;.  m
2e4f0 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d  xCellPerPage = M
2e500 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61  X_CELL(pBt);.  a
2e510 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d  pCell = sqlite3M
2e520 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72  alloc( mxCellPer
2e530 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a  Page*(sizeof(u8*
2e540 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29 20 29  )+sizeof(u16)) )
2e550 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d  ;.  if( apCell==
2e560 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2e570 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c  E_NOMEM;.  szCel
2e580 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
2e590 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 5d  l[mxCellPerPage]
2e5a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
2e5b0 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  eaf ){.    /* Th
2e5c0 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c  e table is compl
2e5d0 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20  etely empty */. 
2e5e0 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2e5f0 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65 20  CE: empty table 
2e600 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
2e610 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no));.  }else{. 
2e620 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70     /* The root p
2e630 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75 74  age is empty but
2e640 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20   has one child. 
2e650 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20   Transfer the.  
2e660 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
2e670 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63   from that one c
2e680 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f  hild into the ro
2e690 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a 20  ot page if it . 
2e6a0 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20     ** will fit. 
2e6b0 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74 68   This reduces th
2e6c0 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
2e6d0 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  ree by one..    
2e6e0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
2e6f0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61   root page is pa
2e700 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73  ge 1, it has les
2e710 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  s space availabl
2e720 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74  e than.    ** it
2e730 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20  s child (due to 
2e740 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65 61  the 100 byte hea
2e750 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  der that occurs 
2e760 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2e770 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64  .    ** of the d
2e780 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f  atabase fle), so
2e790 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65   it might not be
2e7a0 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c   able to hold al
2e7b0 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  l of the .    **
2e7c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72   information cur
2e7d0 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64  rently contained
2e7e0 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20   in the child.  
2e7f0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 0a  If this is the .
2e800 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
2e810 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20  n do not do the 
2e820 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65  transfer.  Leave
2e830 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65 78   page 1 empty ex
2e840 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
2e850 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
2e860 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70  r to the child p
2e870 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20  age.  The child 
2e880 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 20  page becomes.   
2e890 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20   ** the virtual 
2e8a0 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65  root of the tree
2e8b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 56 56 41  ..    */.    VVA
2e8c0 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67  _ONLY( pCur->pag
2e8d0 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29  esShuffled = 1 )
2e8e0 3b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  ;.    pgnoChild 
2e8f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2e900 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2e910 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2e920 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
2e930 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73  hild>0 );.    as
2e940 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c  sert( pgnoChild<
2e950 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
2e960 70 50 61 67 65 2d 3e 70 42 74 29 20 29 3b 0a 20  pPage->pBt) );. 
2e970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e980 74 72 65 65 47 65 74 50 61 67 65 28 70 50 61 67  treeGetPage(pPag
2e990 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c  e->pBt, pgnoChil
2e9a0 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a  d, &pChild, 0);.
2e9b0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2e9c0 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
2e9d0 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70  lance;.    if( p
2e9e0 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b  Page->pgno==1 ){
2e9f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2ea00 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
2ea10 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2ea20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2ea30 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2ea40 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
2ea50 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2ea60 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ow==0 );.      i
2ea70 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65  f( pChild->nFree
2ea80 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  >=100 ){.       
2ea90 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e   /* The child in
2eaa0 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66  formation will f
2eab0 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70  it on the root p
2eac0 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20  age, so do the. 
2ead0 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a         ** copy *
2eae0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
2eaf0 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67  .        zeroPag
2eb00 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2eb10 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
2eb20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2eb30 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
2eb40 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70  +){.          ap
2eb50 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65  Cell[i] = findCe
2eb60 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20  ll(pChild,i);.  
2eb70 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69          szCell[i
2eb80 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2eb90 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69  pChild, apCell[i
2eba0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
2ebb0 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61        assemblePa
2ebc0 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
2ebd0 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c  ->nCell, apCell,
2ebe0 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20   szCell);.      
2ebf0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69    /* Copy the ri
2ec00 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght-pointer of t
2ec10 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20  he child to the 
2ec20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2ec30 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2ec40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ec50 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2ec60 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  e) );.        pu
2ec70 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2ec80 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2ec90 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20  ffset+8], .     
2eca0 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
2ecb0 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70  &pChild->aData[p
2ecc0 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  Child->hdrOffset
2ecd0 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 72  +8]));.        r
2ece0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 43 68  c = freePage(pCh
2ecf0 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ild);.        TR
2ed00 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
2ed10 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72  hild %d transfer
2ed20 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   to page 1\n", p
2ed30 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
2ed40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ed50 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
2ed60 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   has more inform
2ed70 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
2ed80 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e  fit on the root.
2ed90 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
2eda0 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
2edb0 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f  balanced.  Do no
2edc0 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  thing. */.      
2edd0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2ede0 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c  E: child %d will
2edf0 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65   not fit on page
2ee00 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
2ee10 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gno));.      }. 
2ee20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ee30 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44  memcpy(pPage->aD
2ee40 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  ata, pChild->aDa
2ee50 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ta, pPage->pBt->
2ee60 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
2ee70 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
2ee80 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2ee90 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2eea0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
2eeb0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2eec0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2eed0 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
2eee0 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ld);.      TRACE
2eef0 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e  (("BALANCE: tran
2ef00 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e  sfer child %d in
2ef10 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20  to root %d\n",. 
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68               pCh
2ef30 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65  ild->pgno, pPage
2ef40 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
2ef50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ef60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2ef70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2ef80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2ef90 4d 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  M.    if( ISAUTO
2efa0 56 41 43 55 55 4d 20 26 26 20 72 63 3d 3d 53 51  VACUUM && rc==SQ
2efb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2efc0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
2efd0 72 6d 61 70 73 28 70 50 61 67 65 29 3b 0a 20 20  rmaps(pPage);.  
2efe0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
2eff0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
2f000 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c  d);.  }.end_shal
2f010 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73  low_balance:.  s
2f020 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43 65  qlite3_free(apCe
2f030 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ll);.  return rc
2f040 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
2f050 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65  root page is ove
2f060 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rfull.**.** When
2f070 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43   this happens, C
2f080 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c  reate a new chil
2f090 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20  d page and copy 
2f0a0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
2f0b0 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f  of the root into
2f0c0 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65   the child.  The
2f0d0 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a  n make the root.
2f0e0 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79  ** page an empty
2f0f0 20 70 61 67 65 20 77 69 74 68 20 72 69 67 68 74   page with right
2f100 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74  Child pointing t
2f110 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69  o the new.** chi
2f120 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63  ld.   Finally, c
2f130 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65  all balance_inte
2f140 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65  rnal() on the ne
2f150 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61  w child.** to ca
2f160 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e  use it to split.
2f170 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2f180 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 42 74  alance_deeper(Bt
2f190 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2f1a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2f1b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
2f1c0 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
2f1d0 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
2f1e0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
2f1f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
2f200 68 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a  he root page */.
2f210 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
2f220 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  d;    /* Pointer
2f230 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
2f240 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
2f250 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a  gnoChild;     /*
2f260 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2f270 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
2f280 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
2f290 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f   *pBt;         /
2f2a0 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20  * The BTree */. 
2f2b0 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
2f2c0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73       /* Total us
2f2d0 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70  able size of a p
2f2e0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  age */.  u8 *dat
2f2f0 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
2f300 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  Content of the p
2f310 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
2f320 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20  u8 *cdata;      
2f330 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
2f340 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
2f350 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2f360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2f370 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64  set to page head
2f380 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  er in parent */.
2f390 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
2f3a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2f3b0 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  to content of fi
2f3c0 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65  rst cell in pare
2f3d0 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
2f3e0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2f3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2f400 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 6e 4f  r->apPage[0]->nO
2f410 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20  verflow>0 );..  
2f420 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
2f430 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
2f440 31 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  1 );.  pPage = p
2f450 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
2f460 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
2f470 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
2f480 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2f490 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2f4a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f4b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f4c0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2f4d0 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  ) );.  rc = allo
2f4e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2f4f0 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e  t, &pChild, &pgn
2f500 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70  oChild, pPage->p
2f510 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  gno, 0);.  if( r
2f520 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2f530 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f540 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2f550 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65  (pChild->pDbPage
2f560 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
2f570 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
2f580 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ize;.  data = pP
2f590 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
2f5a0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2f5b0 66 73 65 74 3b 0a 20 20 63 62 72 6b 20 3d 20 67  fset;.  cbrk = g
2f5c0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2f5d0 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d  r+5]);.  cdata =
2f5e0 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a   pChild->aData;.
2f5f0 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20    memcpy(cdata, 
2f600 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67  &data[hdr], pPag
2f610 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
2f620 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72  pPage->nCell-hdr
2f630 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61  );.  memcpy(&cda
2f640 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  ta[cbrk], &data[
2f650 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
2f660 65 2d 63 62 72 6b 29 3b 0a 0a 20 20 61 73 73 65  e-cbrk);..  asse
2f670 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e  rt( pChild->isIn
2f680 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  it==0 );.  rc = 
2f690 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2f6a0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2f6b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f6c0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  K ){.    int nCo
2f6d0 70 79 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65  py = pPage->nOve
2f6e0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61  rflow*sizeof(pPa
2f6f0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 3b 0a 20  ge->aOvfl[0]);. 
2f700 20 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64     memcpy(pChild
2f710 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e  ->aOvfl, pPage->
2f720 61 4f 76 66 6c 2c 20 6e 43 6f 70 79 29 3b 0a 20  aOvfl, nCopy);. 
2f730 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72     pChild->nOver
2f740 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f  flow = pPage->nO
2f750 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
2f760 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2f770 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 43 68 69  ow ){.      pChi
2f780 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ld->nFree = 0;. 
2f790 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2f7a0 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d   pChild->nCell==
2f7b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2f7c0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2f7d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2f7e0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2f7f0 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  ge) );.    zeroP
2f800 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
2f810 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50  d->aData[0] & ~P
2f820 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 70 75  TF_LEAF);.    pu
2f830 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2f840 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2f850 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
2f860 69 6c 64 29 3b 0a 20 20 20 20 54 52 41 43 45 28  ild);.    TRACE(
2f870 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
2f880 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
2f890 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2f8a0 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2f8b0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2f8c0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
2f8d0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2f8e0 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c  t, pChild->pgno,
2f8f0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2f900 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  Page->pgno);.#if
2f910 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f920 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2f930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2f950 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
2f960 61 70 73 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  aps(pChild);.   
2f970 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2f980 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 68  c ){.        pCh
2f990 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
2f9a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
2f9b0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
2f9c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f9d0 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  K ){.    pCur->i
2f9e0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72  Page++;.    pCur
2f9f0 2d 3e 61 70 50 61 67 65 5b 31 5d 20 3d 20 70 43  ->apPage[1] = pC
2fa00 68 69 6c 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e  hild;.    pCur->
2fa10 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
2fa20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
2fa30 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  onroot(pCur);.  
2fa40 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
2fa50 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
2fa60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2fa70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
2fa80 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75  age that pCur cu
2fa90 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
2faa0 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  o has just been 
2fab0 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73  modified in.** s
2fac0 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75  ome way. This fu
2fad0 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f  nction figures o
2fae0 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66  ut if this modif
2faf0 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  ication means th
2fb00 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20  e.** tree needs 
2fb10 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20  to be balanced, 
2fb20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20  and if so calls 
2fb30 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2fb40 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f  balancing .** ro
2fb50 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61  utine..** .** Pa
2fb60 72 61 6d 65 74 65 72 20 69 73 49 6e 73 65 72 74  rameter isInsert
2fb70 20 69 73 20 74 72 75 65 20 69 66 20 61 20 6e 65   is true if a ne
2fb80 77 20 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20  w cell was just 
2fb90 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
2fba0 65 0a 2a 2a 20 70 61 67 65 2c 20 6f 72 20 66 61  e.** page, or fa
2fbb0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
2fbc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2fbd0 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70  ance(BtCursor *p
2fbe0 43 75 72 2c 20 69 6e 74 20 69 73 49 6e 73 65 72  Cur, int isInser
2fbf0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2fc00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2fc10 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2fc20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2fc30 69 50 61 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72  iPage];..  asser
2fc40 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2fc50 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2fc60 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2fc70 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2fc80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2fc90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2fca0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2fcb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fcc0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
2fcd0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20  nOverflow>0 ){. 
2fce0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2fcf0 65 5f 64 65 65 70 65 72 28 70 43 75 72 29 3b 0a  e_deeper(pCur);.
2fd00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2fd10 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 70  ur->apPage[0]==p
2fd20 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Page );.      as
2fd30 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2fd40 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21  erflow==0 || rc!
2fd50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2fd60 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2fd70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
2fd80 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
2fd90 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2fda0 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 43 75  ce_shallower(pCu
2fdb0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
2fdc0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
2fdd0 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20  ]==pPage );.    
2fde0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2fdf0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
2fe00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fe10 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2fe20 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2fe30 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a  nOverflow>0 || .
2fe40 20 20 20 20 20 20 20 20 28 21 69 73 49 6e 73 65          (!isInse
2fe50 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  rt && pPage->nFr
2fe60 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ee>pPage->pBt->u
2fe70 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29  sableSize*2/3) )
2fe80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2fe90 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75  ance_nonroot(pCu
2fea0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2feb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2fec0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2fed0 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73   checks all curs
2fee0 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ors that point t
2fef0 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74  o table pgnoRoot
2ff00 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74  ..** If any of t
2ff10 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72  hose cursors wer
2ff20 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  e opened with wr
2ff30 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66  Flag==0 in a dif
2ff40 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61  ferent.** databa
2ff50 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61  se connection (a
2ff60 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2ff70 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73  tion that shares
2ff80 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61   the pager.** ca
2ff90 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72  che with the cur
2ffa0 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  rent connection)
2ffb0 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20   and that other 
2ffc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69  connection .** i
2ffd0 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61  s not in the Rea
2ffe0 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74  dUncommmitted st
2fff0 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ate, then this r
30000 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a  outine returns .
30010 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ** SQLITE_LOCKED
30020 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20  ..**.** As well 
30030 61 73 20 63 75 72 73 6f 72 73 20 77 69 74 68 20  as cursors with 
30040 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f  wrFlag==0, curso
30050 72 73 20 77 69 74 68 20 0a 2a 2a 20 69 73 49 6e  rs with .** isIn
30060 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20  crblobHandle==1 
30070 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65  are also conside
30080 72 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f  red 'read' curso
30090 72 73 20 62 65 63 61 75 73 65 0a 2a 2a 20 69 6e  rs because.** in
300a0 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
300b0 75 72 73 6f 72 73 20 61 72 65 20 75 73 65 64 20  ursors are used 
300c0 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
300d0 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a   and writing..**
300e0 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f  .** When pgnoRoo
300f0 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
30100 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20  ge of an intkey 
30110 74 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63  table, this func
30120 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  tion is also.** 
30130 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
30140 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63  invalidating inc
30150 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
30160 72 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74  rsors when the t
30170 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77  able row.** on w
30180 68 69 63 68 20 74 68 65 79 20 61 72 65 20 6f 70  hich they are op
30190 65 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64 20  ened is deleted 
301a0 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72  or modified. Cur
301b0 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
301c0 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  ated.** accordin
301d0 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  g to the followi
301e0 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
301f0 20 20 31 29 20 57 68 65 6e 20 42 74 72 65 65 43    1) When BtreeC
30200 6c 65 61 72 54 61 62 6c 65 28 29 20 69 73 20 63  learTable() is c
30210 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
30220 65 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 63  ely delete the c
30230 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  ontents.**      
30240 6f 66 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c  of a B-Tree tabl
30250 65 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73  e, pExclude is s
30260 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70  et to zero and p
30270 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73  arameter iRow is
30280 20 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f   .**      set to
30290 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
302a0 69 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72  is case all incr
302b0 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
302c0 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20  sors open.**    
302d0 20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72    on the table r
302e0 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f  ooted at pgnoRoo
302f0 74 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  t are invalidate
30300 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68  d..**.**   2) Wh
30310 65 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  en BtreeInsert()
30320 2c 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20  , BtreeDelete() 
30330 6f 72 20 42 74 72 65 65 50 75 74 44 61 74 61 28  or BtreePutData(
30340 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a  ) is called to .
30350 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61  **      modify a
30360 20 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61   table row via a
30370 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c  n SQL statement,
30380 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74   pExclude is set
30390 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   to the .**     
303a0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 75 73   write cursor us
303b0 65 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64  ed to do the mod
303c0 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61  ification and pa
303d0 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20  rameter iRow is 
303e0 73 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  set.**      to t
303f0 68 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69  he integer row i
30400 64 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  d of the B-Tree 
30410 65 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69  entry being modi
30420 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20  fied. Unless.** 
30430 20 20 20 20 20 70 45 78 63 6c 75 64 65 20 69 73       pExclude is
30440 20 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65   itself an incre
30450 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
30460 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63  or, then all inc
30470 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20  remental.**     
30480 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70   blob cursors op
30490 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f  en on row iRow o
304a0 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 72 65  f the B-Tree are
304b0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a   invalidated..**
304c0 0a 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68  .**   3) If both
304d0 20 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52   pExclude and iR
304e0 6f 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65  ow are set to ze
304f0 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74  ro, no increment
30500 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20  al blob .**     
30510 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76   cursors are inv
30520 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  alidated..*/.sta
30530 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
30540 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 0a 20  ReadConflicts(. 
30550 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
30560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
30580 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f   check */.  Pgno
30590 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20   pgnoRoot,      
305a0 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20      /* Look for 
305b0 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
305c0 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
305d0 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75  BtCursor *pExclu
305e0 64 65 2c 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72  de,     /* Ignor
305f0 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
30600 0a 20 20 69 36 34 20 69 52 6f 77 20 20 20 20 20  .  i64 iRow     
30610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
30620 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
30630 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
30640 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
30650 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
30660 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
30670 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
30680 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20   = pBtree->db;. 
30690 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
306a0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
306b0 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72  pBtree) );.  for
306c0 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
306d0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
306e0 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
306f0 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
30700 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
30710 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
30720 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
30730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
30740 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20  NCRBLOB.    if( 
30750 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
30760 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20  dle && ( .      
30770 20 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26     (!pExclude &&
30780 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20   iRow).      || 
30790 28 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45  (pExclude && !pE
307a0 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c  xclude->isIncrbl
307b0 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69  obHandle && p->i
307c0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a  nfo.nKey==iRow).
307d0 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d      )){.      p-
307e0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
307f0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a  _INVALID;.    }.
30800 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
30810 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
30820 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75  _VALID ) continu
30830 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72  e;.    if( p->wr
30840 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66  Flag==0 .#ifndef
30850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
30860 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d  RBLOB.     || p-
30870 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
30880 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  e.#endif.    ){.
30890 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
308a0 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72  bOther = p->pBtr
308b0 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 61 73  ee->db;.      as
308c0 73 65 72 74 28 64 62 4f 74 68 65 72 29 3b 0a 20  sert(dbOther);. 
308d0 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72       if( dbOther
308e0 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72  !=db && (dbOther
308f0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
30900 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
30910 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
30920 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
30930 6e 42 6c 6f 63 6b 65 64 28 64 62 2c 20 64 62 4f  nBlocked(db, dbO
30940 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ther);.        r
30950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
30960 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
30970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30980 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
30990 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
309a0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
309b0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
309c0 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
309d0 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
309e0 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
309f0 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
30a00 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
30a10 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
30a20 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
30a30 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
30a40 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
30a50 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
30a60 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
30a70 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
30a80 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
30a90 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
30aa0 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
30ab0 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
30ac0 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
30ad0 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
30ae0 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
30af0 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
30b00 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
30b10 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
30b20 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
30b30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
30b40 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
30b50 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
30b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
30b70 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
30b80 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
30b90 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
30ba0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
30bb0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
30bc0 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
30bd0 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
30be0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
30bf0 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
30c00 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
30c10 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
30c20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
30c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
30c50 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
30c60 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
30c70 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
30c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c90 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
30ca0 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
30cb0 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
30cc0 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
30cd0 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69    int szNew;.  i
30ce0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
30cf0 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65  e *pPage;.  Btre
30d00 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
30d10 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
30d20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
30d30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
30d40 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67  oldCell;.  unsig
30d50 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c  ned char *newCel
30d60 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
30d70 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
30d80 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
30d90 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
30da0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
30db0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
30dc0 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
30dd0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
30de0 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20  Cur->wrFlag );. 
30df0 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65   rc = checkForRe
30e00 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 43 75 72  adConflicts(pCur
30e10 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e  ->pBtree, pCur->
30e20 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20  pgnoRoot, pCur, 
30e30 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 72 63 20  nKey);.  if( rc 
30e40 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 0a  ){             .
30e50 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
30e60 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
30e70 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
30e80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
30e90 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  c==SQLITE_LOCKED
30ea0 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a  _SHAREDCACHE );.
30eb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30ec0 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
30ed0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
30ee0 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
30ef0 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
30f00 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
30f10 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
30f20 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
30f30 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
30f40 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  le */.  sqlite3B
30f50 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
30f60 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20 20  pCur);.  if( .  
30f70 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
30f80 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
30f90 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
30fa0 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c  oRoot, pCur)) ||
30fb0 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
30fc0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
30fd0 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
30fe0 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e  Key, nKey, appen
30ff0 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20  dBias, &loc)).  
31000 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
31010 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  ;.  }..  pPage =
31020 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
31030 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
31040 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
31050 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
31060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31070 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
31080 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54  e->intKey );.  T
31090 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74  RACE(("INSERT: t
310a0 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c  able=%d nkey=%ll
310b0 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d  d ndata=%d page=
310c0 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
310d0 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
310e0 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c  ot, nKey, nData,
310f0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20   pPage->pgno,.  
31100 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f          loc==0 ?
31110 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22   "overwrite" : "
31120 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20  new entry"));.  
31130 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
31140 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63  sInit );.  alloc
31150 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
31160 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70  );.  newCell = p
31170 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
31180 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
31190 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
311a0 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
311b0 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
311c0 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
311d0 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
311e0 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
311f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
31200 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
31210 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
31220 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
31230 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
31240 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
31250 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
31260 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75  ) );.  idx = pCu
31270 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
31280 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63  Page];.  if( loc
31290 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
312a0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
312b0 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f  e ){.    u16 szO
312c0 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
312d0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
312e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
312f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31300 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
31310 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
31320 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73      goto end_ins
31330 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ert;.    }.    o
31340 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  ldCell = findCel
31350 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20  l(pPage, idx);. 
31360 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
31370 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  eaf ){.      mem
31380 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64  cpy(newCell, old
31390 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a  Cell, 4);.    }.
313a0 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c      szOld = cell
313b0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f  SizePtr(pPage, o
313c0 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20  ldCell);.    rc 
313d0 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
313e0 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
313f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
31400 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 72  nd_insert;.    r
31410 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61  c = dropCell(pPa
31420 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b  ge, idx, szOld);
31430 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31440 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
31450 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
31460 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
31470 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61  if( loc<0 && pPa
31480 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ge->nCell>0 ){. 
31490 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
314a0 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69 64  ->leaf );.    id
314b0 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
314c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
314d0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
314e0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
314f0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
31500 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
31510 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
31520 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  eaf );.  }.  rc 
31530 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
31540 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ge, idx, newCell
31550 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  , szNew, 0, 0);.
31560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31570 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
31580 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 31 29  balance(pCur, 1)
31590 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 75 73 74  ;.  }..  /* Must
315a0 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76 65 72   make sure nOver
315b0 66 6c 6f 77 20 69 73 20 72 65 73 65 74 20 74 6f  flow is reset to
315c0 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 74 68   zero even if th
315d0 65 20 62 61 6c 61 6e 63 65 28 29 0a 20 20 2a 2a  e balance().  **
315e0 20 66 61 69 6c 73 2e 20 20 49 6e 74 65 72 6e 61   fails.  Interna
315f0 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
31600 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
31610 20 72 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73   result otherwis
31620 65 2e 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 61 70  e. */.  pCur->ap
31630 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
31640 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  ]->nOverflow = 0
31650 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
31660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
31670 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
31680 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a    }.end_insert:.
31690 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
316a0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
316b0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
316c0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
316d0 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
316e0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
316f0 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62 69  inting at a arbi
31700 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  trary location..
31710 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
31720 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
31730 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
31740 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
31750 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
31760 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e 74 20 69  >iPage];.  int i
31770 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dx;.  unsigned c
31780 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
31790 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  t rc;.  Pgno pgn
317a0 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74  oChild = 0;.  Bt
317b0 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
317c0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
317d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
317e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
317f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
31800 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
31810 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
31820 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
31830 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
31840 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
31850 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
31860 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
31870 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
31880 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
31890 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
318a0 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  kip;.  }.  if( N
318b0 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78  EVER(pCur->aiIdx
318c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
318d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 20 29 7b 0a  Page->nCell) ){.
318e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
318f0 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65  E_ERROR;  /* The
31900 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
31910 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68  ointing to anyth
31920 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ing */.  }.  ass
31930 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61  ert( pCur->wrFla
31940 67 20 29 3b 0a 20 20 72 63 20 3d 20 63 68 65 63  g );.  rc = chec
31950 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74  kForReadConflict
31960 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
31970 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72 2d  oot, pCur, pCur-
31980 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 69  >info.nKey);.  i
31990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
319a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
319b0 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
319c0 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
319d0 6f 63 6b 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ock */.    asser
319e0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  t( rc==SQLITE_LO
319f0 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
31a00 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   );.    return r
31a10 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  c;.  }..  /* Res
31a20 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
31a30 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
31a40 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65   (a no-op if the
31a50 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69   cursor is not i
31a60 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52  n .  ** CURSOR_R
31a70 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
31a80 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70  ) and save the p
31a90 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
31aa0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20  other cursors . 
31ab0 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   ** open on the 
31ac0 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e  same table. Then
31ad0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
31ae0 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65  erWrite() on the
31af0 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
31b00 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  the entry will b
31b10 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a  e deleted from..
31b20 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
31b30 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72  (rc = restoreCur
31b40 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
31b50 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
31b60 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
31b70 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
31b80 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30  oRoot, pCur))!=0
31b90 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71   ||.    (rc = sq
31ba0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31bb0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
31bc0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  !=0.  ){.    ret
31bd0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
31be0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  * Locate the cel
31bf0 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67  l within its pag
31c00 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c  e and leave pCel
31c10 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  l pointing to th
31c20 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65  e.  ** data. The
31c30 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c   clearCell() cal
31c40 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72  l frees any over
31c50 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
31c60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
31c70 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65   ** cell. The ce
31c80 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69  ll itself is sti
31c90 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a  ll intact..  */.
31ca0 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
31cb0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
31cc0 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
31cd0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
31ce0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
31cf0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
31d00 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
31d10 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  (pCell);.  }.  r
31d20 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
31d30 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69  age, pCell);.  i
31d40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
31d50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
31d60 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
31d70 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
31d80 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72   The entry we ar
31d90 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
31da0 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20  e is not a leaf 
31db0 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a  so if we do not.
31dc0 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68      ** do someth
31dd0 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  ing we will leav
31de0 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69  e a hole on an i
31df0 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20  nternal page..  
31e00 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20    ** We have to 
31e10 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79  fill the hole by
31e20 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c   moving in a cel
31e30 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20  l from a leaf.  
31e40 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  The.    ** next 
31e50 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f  Cell after the o
31e60 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ne to be deleted
31e70 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
31e80 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20  o exist and.    
31e90 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20  ** to be a leaf 
31ea0 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74  so we can use it
31eb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43  ..    */.    BtC
31ec0 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20  ursor leafCur;. 
31ed0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61     MemPage *pLea
31ee0 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  fPage = 0;..    
31ef0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
31f00 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f  Next;.    int no
31f10 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67  tUsed;.    unsig
31f20 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65  ned char *tempCe
31f30 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ll = 0;.    asse
31f40 72 74 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  rt( !pPage->intK
31f50 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ey );.    sqlite
31f60 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72  3BtreeGetTempCur
31f70 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43  sor(pCur, &leafC
31f80 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ur);.    rc = sq
31f90 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26  lite3BtreeNext(&
31fa0 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65  leafCur, &notUse
31fb0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
31fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31fd0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
31fe0 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72  ur.aiIdx[leafCur
31ff0 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20  .iPage]==0 );.  
32000 20 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20      pLeafPage = 
32010 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c  leafCur.apPage[l
32020 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20  eafCur.iPage];. 
32030 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32040 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61  3PagerWrite(pLea
32050 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  fPage->pDbPage);
32060 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
32070 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32080 20 20 20 20 20 20 69 6e 74 20 6c 65 61 66 43 75        int leafCu
32090 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 30 3b  rsorInvalid = 0;
320a0 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78  .      u16 szNex
320b0 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  t;.      TRACE((
320c0 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
320d0 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61  d delete interna
320e0 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63  l from %d replac
320f0 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
32100 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72  ",.         pCur
32110 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
32120 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66 50 61  e->pgno, pLeafPa
32130 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
32140 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
32150 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  , idx, cellSizeP
32160 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
32170 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
32180 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 50   findCell(pLeafP
32190 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  age, 0);.      s
321a0 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65  zNext = cellSize
321b0 50 74 72 28 70 4c 65 61 66 50 61 67 65 2c 20 70  Ptr(pLeafPage, p
321c0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Next);.      ass
321d0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  ert( MX_CELL_SIZ
321e0 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34  E(pBt)>=szNext+4
321f0 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61   );.      alloca
32200 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
32210 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c  ;.      tempCell
32220 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
32230 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d  e;.      if( tem
32240 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
32250 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32260 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
32270 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32290 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
322a0 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 70 4e  l(pPage, idx, pN
322b0 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c  ext-4, szNext+4,
322c0 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20   tempCell, 0);. 
322d0 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f       }...      /
322e0 2a 20 54 68 65 20 22 69 66 22 20 73 74 61 74 65  * The "if" state
322f0 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e 65 78 74  ment in the next
32300 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73 20 63   code block is c
32310 72 69 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  ritical.  The.  
32320 20 20 20 20 2a 2a 20 73 6c 69 67 68 74 65 73 74      ** slightest
32330 20 65 72 72 6f 72 20 69 6e 20 74 68 61 74 20 73   error in that s
32340 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 61  tatement would a
32350 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f 20 6f  llow SQLite to o
32360 70 65 72 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  perate.      ** 
32370 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74 20 6f  correctly most o
32380 66 20 74 68 65 20 74 69 6d 65 20 62 75 74 20 70  f the time but p
32390 72 6f 64 75 63 65 20 76 65 72 79 20 72 61 72 65  roduce very rare
323a0 20 66 61 69 6c 75 72 65 73 2e 20 20 54 6f 0a 20   failures.  To. 
323b0 20 20 20 20 20 2a 2a 20 67 75 61 72 64 20 61 67       ** guard ag
323c0 61 69 6e 73 74 20 74 68 69 73 2c 20 74 68 65 20  ainst this, the 
323d0 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
323e0 20 68 65 6c 70 20 74 6f 20 76 65 72 69 66 79 20   help to verify 
323f0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  that.      ** th
32400 65 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74  e "if" statement
32410 20 69 73 20 77 65 6c 6c 20 74 65 73 74 65 64 2e   is well tested.
32420 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32430 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
32440 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
32450 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 70 42   pPage->nFree<pB
32460 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
32470 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3 .             
32480 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
32490 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
324a0 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
324b0 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20  ze*2/3 );.      
324c0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
324d0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
324e0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70   pPage->nFree==p
324f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
32500 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  /3 .            
32510 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
32520 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
32530 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
32540 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20  ize*2/3 );.     
32550 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
32560 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
32570 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d  & pPage->nFree==
32580 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
32590 32 2f 33 2b 31 20 0a 20 20 20 20 20 20 20 20 20  2/3+1 .         
325a0 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66          && pLeaf
325b0 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
325c0 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
325d0 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20  leSize*2/3 );.  
325e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
325f0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
32600 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
32610 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  <=pBt->usableSiz
32620 65 2a 32 2f 33 0a 20 20 20 20 20 20 20 20 20 20  e*2/3.          
32630 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
32640 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
32650 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
32660 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
32670 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 50     testcase( (pP
32680 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
32690 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65   || (pPage->nFre
326a0 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e > pBt->usableS
326b0 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20 20 20  ize*2/3)).      
326c0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c             && pL
326d0 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
326e0 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74 2d 3e  +szNext == pBt->
326f0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29  usableSize*2/3 )
32700 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70  ;...      if( (p
32710 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
32720 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72  0 || (pPage->nFr
32730 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee > pBt->usable
32740 53 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a 20 20  Size*2/3)) &&.  
32750 20 20 20 20 20 20 20 20 28 70 4c 65 61 66 50 61          (pLeafPa
32760 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
32770 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
32780 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20 20 20  Size*2/3).      
32790 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
327a0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
327b0 65 6e 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  en if the intern
327c0 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20 65  al node is now e
327d0 69 74 68 65 72 20 6f 76 65 72 66 6c 6f 77 69 6e  ither overflowin
327e0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  g.        ** or 
327f0 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 74 68  underfull and th
32800 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 6c 6c  e leaf node will
32810 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 20 61 66   be underfull af
32820 74 65 72 20 74 68 65 20 6a 75 73 74 20 63 65 6c  ter the just cel
32830 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  l .        ** co
32840 70 69 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  pied to the inte
32850 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64 65 6c  rnal node is del
32860 65 74 65 64 20 66 72 6f 6d 20 69 74 2e 20 54 68  eted from it. Th
32870 69 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 0a  is is a special.
32880 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
32890 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
328a0 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 74 6f   to balance() to
328b0 20 63 6f 72 72 65 63 74 20 74 68 65 20 69 6e 74   correct the int
328c0 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20 20 20  ernal node.     
328d0 20 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e 67 65     ** may change
328e0 20 74 68 65 20 74 72 65 65 20 73 74 72 75 63 74   the tree struct
328f0 75 72 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ure and invalida
32900 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
32910 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
32920 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  e leafCur.apPage
32930 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61  [] and leafCur.a
32940 69 49 64 78 5b 5d 20 61 72 72 61 79 73 2c 20 77  iIdx[] arrays, w
32950 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 20 20 20  hich will be.   
32960 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20       ** used by 
32970 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 65  the balance() re
32980 71 75 69 72 65 64 20 74 6f 20 63 6f 72 72 65 63  quired to correc
32990 74 20 74 68 65 20 75 6e 64 65 72 66 75 6c 6c 20  t the underfull 
329a0 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  leaf.        ** 
329b0 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  node..        **
329c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
329d0 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 69 6e 20  formula used in 
329e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
329f0 62 6f 76 65 20 61 72 65 20 62 61 73 65 64 20 6f  bove are based o
32a00 6e 20 66 61 63 65 74 73 20 6f 66 0a 20 20 20 20  n facets of.    
32a10 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74      ** the SQLit
32a20 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 74 68  e file-format th
32a30 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  at do not change
32a40 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20 20 20   over time..    
32a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74      */.        t
32a60 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
32a70 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62  nFree==pBt->usab
32a80 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a  leSize*2/3+1 );.
32a90 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32aa0 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72  ( pLeafPage->nFr
32ab0 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70 42 74  ee+2+szNext==pBt
32ac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
32ad0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  +1 );.        le
32ae0 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20  afCursorInvalid 
32af0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 20 20 20  = 1;.      }    
32b00 20 20 20 20 0a 0a 20 20 20 20 20 20 69 66 28 20      ..      if( 
32b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32b20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32b40 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
32b50 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
32b60 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
32b70 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
32b80 61 67 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43  age, idx), pgnoC
32b90 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 56  hild);.        V
32ba0 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70  VA_ONLY( pCur->p
32bb0 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 30  agesShuffled = 0
32bc0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
32bd0 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30   balance(pCur, 0
32be0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
32bf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32c00 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75 72 73 6f  _OK && leafCurso
32c10 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20 20 20  rInvalid ){.    
32c20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 61 66 2d      /* The leaf-
32c30 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e 64 65  node is now unde
32c40 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74 68 65  rfull and so the
32c50 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62   tree needs to b
32c60 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
32c70 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65 76 65  balanced. Howeve
32c80 72 2c 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  r, the balance()
32c90 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
32ca0 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20  e internal.     
32cb0 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f 76 65     ** node above
32cc0 20 6d 61 79 20 68 61 76 65 20 6d 6f 64 69 66 69   may have modifi
32cd0 65 64 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ed the structure
32ce0 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61   of the B-Tree a
32cf0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  nd.        ** so
32d00 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
32d10 74 65 6e 74 73 20 6f 66 20 6c 65 61 66 43 75 72  tents of leafCur
32d20 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65  .apPage[] and le
32d30 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a 20 20  afCur.aiIdx[].  
32d40 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74        ** may not
32d50 20 62 65 20 74 72 75 73 74 65 64 2e 0a 20 20 20   be trusted..   
32d60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
32d70 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
32d80 73 69 62 6c 65 20 74 6f 20 63 6f 70 79 20 74 68  sible to copy th
32d90 65 20 61 6e 63 65 73 74 72 79 20 66 72 6f 6d 20  e ancestry from 
32da0 70 43 75 72 2c 20 61 73 20 74 68 65 20 73 61 6d  pCur, as the sam
32db0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c  e.        ** bal
32dc0 61 6e 63 65 28 29 20 63 61 6c 6c 20 68 61 73 20  ance() call has 
32dd0 69 6e 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  invalidated the 
32de0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d 20 61  pCur->apPage[] a
32df0 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20 20 20 20  nd aiIdx[].     
32e00 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 0a 20     ** arrays. . 
32e10 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
32e20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
32e30 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
32e40 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e 74 65  ion() below inte
32e50 72 6e 61 6c 6c 79 20 73 61 76 65 73 20 74 68 65  rnally saves the
32e60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79   .        ** key
32e70 20 74 68 61 74 20 6c 65 61 66 43 75 72 20 69 73   that leafCur is
32e80 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
32e90 69 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e 74 6c  ing to. Currentl
32ea0 79 2c 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  y, there.       
32eb0 20 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f 70 69   ** are two copi
32ec0 65 73 20 6f 66 20 74 68 61 74 20 6b 65 79 20 69  es of that key i
32ed0 6e 20 74 68 65 20 74 72 65 65 20 2d 20 6f 6e 65  n the tree - one
32ee0 20 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 65 61   here on the lea
32ef0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  f.        ** pag
32f00 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d  e and one on som
32f10 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
32f20 69 6e 20 74 68 65 20 74 72 65 65 2e 20 54 68 65  in the tree. The
32f30 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20 20 20   copy on.       
32f40 20 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   ** the leaf nod
32f50 65 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  e is always the 
32f60 6e 65 78 74 20 6b 65 79 20 69 6e 20 74 72 65 65  next key in tree
32f70 2d 6f 72 64 65 72 20 61 66 74 65 72 20 74 68 65  -order after the
32f80 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70   .        ** cop
32f90 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  y on the interna
32fa0 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68 65 20  l node. So, the 
32fb0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
32fc0 74 72 65 65 4e 65 78 74 28 29 0a 20 20 20 20 20  treeNext().     
32fd0 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65 73 74     ** calls rest
32fe0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
32ff0 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20 74 68 65  n() to point the
33000 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 63   cursor to the c
33010 6f 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  opy.        ** s
33020 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 69 6e 74  tored on the int
33030 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65 6e  ernal node, then
33040 20 61 64 76 61 6e 63 65 73 20 74 6f 20 74 68 65   advances to the
33050 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20 20 20   next entry,.   
33060 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 68 61       ** which ha
33070 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
33080 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79 20  copy of the key 
33090 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  on the internal 
330a0 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  node..        **
330b0 20 4e 65 74 20 65 66 66 65 63 74 3a 20 6c 65 61   Net effect: lea
330c0 66 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  fCur is pointing
330d0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 75 70   back to the dup
330e0 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20 20 20 20  licate cell.    
330f0 20 20 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64      ** that need
33100 73 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2c  s to be removed,
33110 20 61 6e 64 20 74 68 65 20 6c 65 61 66 43 75 72   and the leafCur
33120 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a 20 20  .apPage[] and.  
33130 20 20 20 20 20 20 2a 2a 20 6c 65 61 66 43 75 72        ** leafCur
33140 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 20  .aiIdx[] arrays 
33150 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 20 20 20  are correct..   
33160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33170 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c  VVA_ONLY( Pgno l
33180 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61 66 50  eafPgno = pLeafP
33190 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 20  age->pgno );.   
331a0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
331b0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26 6c 65  rsorPosition(&le
331c0 61 66 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  afCur);.        
331d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
331e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
331f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
33200 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
33210 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 20 20  notUsed);.      
33220 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 65 61    }.        pLea
33230 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e  fPage = leafCur.
33240 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69  apPage[leafCur.i
33250 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 20 20 61  Page];.        a
33260 73 73 65 72 74 28 20 70 4c 65 61 66 50 61 67 65  ssert( pLeafPage
33270 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e 6f  ->pgno==leafPgno
33280 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
33290 72 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49 64  rt( leafCur.aiId
332a0 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d  x[leafCur.iPage]
332b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ==0 );.      }..
332c0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
332d0 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20 20 26  _OK==rc.       &
332e0 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
332f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33300 72 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d 3e  rite(pLeafPage->
33310 70 44 62 50 61 67 65 29 29 20 0a 20 20 20 20 20  pDbPage)) .     
33320 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72 6f 70   ){.        drop
33330 43 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20  Cell(pLeafPage, 
33340 30 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20  0, szNext);.    
33350 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6c 65      VVA_ONLY( le
33360 61 66 43 75 72 2e 70 61 67 65 73 53 68 75 66 66  afCur.pagesShuff
33370 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20  led = 0 );.     
33380 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
33390 26 6c 65 61 66 43 75 72 2c 20 30 29 3b 0a 20 20  &leafCur, 0);.  
333a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
333b0 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20  afCursorInvalid 
333c0 7c 7c 20 21 6c 65 61 66 43 75 72 2e 70 61 67 65  || !leafCur.page
333d0 73 53 68 75 66 66 6c 65 64 0a 20 20 20 20 20 20  sShuffled.      
333e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
33400 21 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66  !pCur->pagesShuf
33410 66 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a  fled );.      }.
33420 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
33430 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
33440 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72  pCursor(&leafCur
33450 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
33460 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
33470 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
33480 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
33490 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67  .       pCur->pg
334a0 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70  noRoot, pPage->p
334b0 67 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  gno));.    rc = 
334c0 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
334d0 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72  idx, cellSizePtr
334e0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b  (pPage, pCell));
334f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
33500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33510 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75  rc = balance(pCu
33520 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  r, 0);.    }.  }
33530 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
33540 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
33550 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
33560 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
33570 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
33580 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65   new BTree table
33590 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
335a0 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a  iTable the page.
335b0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
335c0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
335d0 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a  he new table..**
335e0 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20  .** The type of 
335f0 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e  type is determin
33600 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20  ed by the flags 
33610 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79  parameter.  Only
33620 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
33630 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67  g values of flag
33640 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
33650 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76  in use.  Other v
33660 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61  alues for.** fla
33670 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72  gs might not wor
33680 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52  k:.**.**     BTR
33690 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f  EE_INTKEY|BTREE_
336a0 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65  LEAFDATA     Use
336b0 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73  d for SQL tables
336c0 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73   with rowid keys
336d0 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45  .**     BTREE_ZE
336e0 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20  RODATA          
336f0 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72          Used for
33700 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a   SQL indices.*/.
33710 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
33720 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
33730 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
33740 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
33750 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33760 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
33770 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67  age *pRoot;.  Pg
33780 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69  no pgnoRoot;.  i
33790 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
337a0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
337b0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
337c0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
337d0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
337e0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
337f0 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
33800 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20  Only );..#ifdef 
33810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
33820 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
33830 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
33840 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
33850 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
33860 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
33870 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
33880 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
33890 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
338a0 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
338b0 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
338c0 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
338d0 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
338e0 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
338f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
33900 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
33910 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
33920 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61     /* Creating a
33930 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70   new table may p
33940 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20  robably require 
33950 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69  moving an existi
33960 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  ng database.    
33970 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  ** to make room 
33980 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
33990 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e  es root page. In
339a0 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20   case this page 
339b0 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74  turns.    ** out
339c0 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c   to be an overfl
339d0 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20  ow page, delete 
339e0 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  all overflow pag
339f0 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20  e-map caches.   
33a00 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e   ** held by open
33a10 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f   cursors..    */
33a20 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
33a30 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
33a40 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  pBt);..    /* Re
33a50 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
33a60 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65  meta[3] from the
33a70 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74   database to det
33a80 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65  ermine where the
33a90 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
33aa0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
33ab0 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65  le should go. me
33ac0 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72  ta[3] is the lar
33ad0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
33ae0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f     ** created so
33af0 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77   far, so the new
33b00 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d   root-page is (m
33b10 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a  eta[3]+1)..    *
33b20 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
33b30 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
33b40 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b  , 4, &pgnoRoot);
33b50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
33b60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33b70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
33b80 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b  .    pgnoRoot++;
33b90 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  ..    /* The new
33ba0 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e   root-page may n
33bb0 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
33bc0 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  on a pointer-map
33bd0 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20   page, or the.  
33be0 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
33bf0 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  E page..    */. 
33c00 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f     while( pgnoRo
33c10 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
33c20 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
33c30 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
33c40 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
33c50 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
33c60 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
33c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
33c80 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
33c90 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
33ca0 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
33cb0 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
33cc0 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
33cd0 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
33ce0 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
33cf0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
33d00 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
33d10 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
33d20 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
33d30 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
33d40 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
33d50 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
33d60 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
33d70 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
33d80 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
33d90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
33da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33db0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
33dc0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
33dd0 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
33de0 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
33df0 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
33e00 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
33e10 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
33e20 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
33e30 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
33e40 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
33e50 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
33e60 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
33e70 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
33e80 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
33e90 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
33ea0 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
33eb0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
33ec0 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
33ed0 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
33ee0 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
33ef0 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
33f00 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
33f10 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
33f20 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
33f30 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
33f40 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
33f50 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
33f60 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
33f70 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
33f80 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
33f90 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
33fa0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
33fb0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
33fc0 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
33fd0 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
33fe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33ff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
34010 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
34020 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
34030 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
34040 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
34050 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34060 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
34070 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
34080 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
34090 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
340a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
340b0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
340c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
340d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
340e0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
340f0 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
34100 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
34110 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
34120 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
34130 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
34140 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
34150 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20  Page, pgnoMove, 
34160 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  0);.      releas
34170 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20  ePage(pRoot);.. 
34180 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74       /* Obtain t
34190 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52  he page at pgnoR
341a0 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  oot */.      if(
341b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
341c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
341d0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
341e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
341f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
34200 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
34210 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
34220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34230 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
34240 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
34250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34260 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
34270 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
34280 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34290 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
342a0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
342b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
342c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
342d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
342e0 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
342f0 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
34300 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
34310 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
34320 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
34330 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
34340 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
34350 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
34360 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
34370 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
34380 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
34390 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
343a0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
343b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
343c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
343d0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
343e0 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
343f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
34400 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
34410 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
34420 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
34430 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
34440 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
34450 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
34460 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
34470 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
34480 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
34490 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
344a0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
344b0 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
344c0 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
344d0 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
344e0 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
344f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34500 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
34510 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
34520 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
34530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34540 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
34550 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
34560 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
34570 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
34580 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
34590 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
345a0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
345b0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
345c0 63 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54  c = btreeCreateT
345d0 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c  able(p, piTable,
345e0 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74   flags);.  sqlit
345f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
34600 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34610 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65  ./*.** Erase the
34620 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
34630 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73  page and all its
34640 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75   children.  Retu
34650 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74  rn.** the page t
34660 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
34670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
34680 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
34690 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
346a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
346b0 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f  he BTree that co
346c0 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
346d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
346e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
346f0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c  age number to cl
34700 65 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65  ear */.  int fre
34710 65 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f  ePageFlag,     /
34720 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67  * Deallocate pag
34730 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  e if true */.  i
34740 6e 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a  nt *pnChange.){.
34750 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
34760 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
34770 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
34780 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pCell;.  int i;
34790 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
347a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
347b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
347c0 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61  if( pgno>pagerPa
347d0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
347e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
347f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34800 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41    }..  rc = getA
34810 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
34820 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
34830 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
34840 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
34850 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  _out;.  for(i=0;
34860 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
34870 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c   i++){.    pCell
34880 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
34890 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21  e, i);.    if( !
348a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
348b0 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44       rc = clearD
348c0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
348d0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
348e0 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a  , 1, pnChange);.
348f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
34900 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
34910 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
34920 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
34930 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
34940 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
34950 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
34960 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  sepage_out;.  }.
34970 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
34980 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  af ){.    rc = c
34990 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
349a0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
349b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29  pPage->aData[8])
349c0 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a  , 1, pnChange);.
349d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
349e0 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
349f0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65  age_out;.  }else
34a00 20 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29 7b   if( pnChange ){
34a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
34a20 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
34a30 20 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70    *pnChange += p
34a40 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d  Page->nCell;.  }
34a50 0a 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46  .  if( freePageF
34a60 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
34a70 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
34a80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63  .  }else if( (rc
34a90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34aa0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
34ab0 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  age))==0 ){.    
34ac0 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
34ad0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
34ae0 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d  | PTF_LEAF);.  }
34af0 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  ..cleardatabasep
34b00 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61  age_out:.  relea
34b10 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
34b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34b30 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
34b40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
34b50 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
34b60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
34b70 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74    iTable is.** t
34b80 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
34b90 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  f the root of th
34ba0 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20  e table.  After 
34bb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
34bc0 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f  urns,.** the roo
34bd0 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c  t page is empty,
34be0 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74   but still exist
34bf0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
34c00 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
34c10 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
34c20 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
34c30 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64  any open.** read
34c40 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
34c50 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69  table.  Open wri
34c60 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d  te cursors are m
34c70 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72  oved to the.** r
34c80 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
34c90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61  ..**.** If pnCha
34ca0 6e 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nge is not NULL,
34cb0 20 74 68 65 6e 20 74 61 62 6c 65 20 69 54 61 62   then table iTab
34cc0 6c 65 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e  le must be an in
34cd0 74 6b 65 79 20 74 61 62 6c 65 2e 20 54 68 65 0a  tkey table. The.
34ce0 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ** integer value
34cf0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
34d00 6e 43 68 61 6e 67 65 20 69 73 20 69 6e 63 72 65  nChange is incre
34d10 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75  mented by the nu
34d20 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69  mber of.** entri
34d30 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  es in the table.
34d40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
34d50 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42  treeClearTable(B
34d60 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
34d70 62 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e  ble, int *pnChan
34d80 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
34d90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
34da0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
34db0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
34dc0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
34dd0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
34de0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
34df0 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 28  WRITE );.  if( (
34e00 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61  rc = checkForRea
34e10 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
34e20 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53 51  able, 0, 1))!=SQ
34e30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
34e40 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
34e50 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53  */.  }else if( S
34e60 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
34e70 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
34e80 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20  Bt, iTable, 0)) 
34e90 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e  ){.    /* nothin
34ea0 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
34eb0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  se{.    rc = cle
34ec0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
34ed0 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
34ee0 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a  , 0, pnChange);.
34ef0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
34f00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
34f10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34f20 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f  * Erase all info
34f30 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62  rmation in a tab
34f40 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  le and add the r
34f50 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
34f60 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c   to.** the freel
34f70 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ist.  Except, th
34f80 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72  e root of the pr
34f90 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74  inciple table (t
34fa0 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67  he one on.** pag
34fb0 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61 64  e 1) is never ad
34fc0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
34fd0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ist..**.** This 
34fe0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
34ff0 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
35000 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
35010 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75  e any open.** cu
35020 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
35030 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54  le..**.** If AUT
35040 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c  OVACUUM is enabl
35050 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
35060 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74  at iTable is not
35070 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f   the last.** roo
35080 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  t page in the da
35090 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
350a0 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  n the last root 
350b0 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  page .** in the 
350c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
350d0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
350e0 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
350f0 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61  cupied by.** iTa
35100 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73  ble and that las
35110 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  t slot formerly 
35120 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65 20  occupied by the 
35130 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a  last root page.*
35140 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
35150 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65  e freelist inste
35160 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49  ad of iTable.  I
35170 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a  n this say, all.
35180 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72  ** root pages ar
35190 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62 65  e kept at the be
351a0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
351b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
351c0 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73  ich.** is necess
351d0 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55  ary for AUTOVACU
351e0 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74  UM to work right
351f0 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  .  *piMoved is s
35200 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61  et to the .** pa
35210 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75  ge number that u
35220 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  sed to be the la
35230 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  st root page in 
35240 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  the file before.
35250 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66  ** the move.  If
35260 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f   no page gets mo
35270 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73  ved, *piMoved is
35280 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68   set to 0..** Th
35290 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
352a0 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20   is recorded in 
352b0 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20  meta[3] and the 
352c0 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61  value of.** meta
352d0 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 62  [3] is updated b
352e0 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
352f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35300 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  btreeDropTable(B
35310 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
35320 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76  able, int *piMov
35330 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
35340 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
35350 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
35360 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
35370 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35380 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
35390 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
353a0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
353b0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20 2f  NS_WRITE );..  /
353c0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
353d0 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20  to drop a table 
353e0 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  if any cursors a
353f0 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20  re open on the. 
35400 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
35410 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
35420 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
35430 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61  e the backend ma
35440 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d  y.  ** need to m
35450 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74  ove another root
35460 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20  -page to fill a 
35470 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
35480 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f  deleted.  ** roo
35490 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70  t page. If an op
354a0 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73  en cursor was us
354b0 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20  ing this page a 
354c0 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20  problem would . 
354d0 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a   ** occur..  */.
354e0 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
354f0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
35500 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
35510 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70  ed(p->db, pBt->p
35520 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e  Cursor->pBtree->
35530 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
35540 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
35550 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
35560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
35570 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
35580 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
35590 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
355a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
355b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
355c0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c  reeClearTable(p,
355d0 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69   iTable, 0);.  i
355e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c  f( rc ){.    rel
355f0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
35600 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
35610 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20    }..  *piMoved 
35620 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62  = 0;..  if( iTab
35630 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53  le>1 ){.#ifdef S
35640 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
35650 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66  ACUUM.    rc = f
35660 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
35670 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35680 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20  pPage);.#else.  
35690 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
356a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50  acuum ){.      P
356b0 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b  gno maxRootPgno;
356c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
356d0 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
356e0 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67  p, 4, &maxRootPg
356f0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
35700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35710 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
35720 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
35730 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35740 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
35750 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f  ( iTable==maxRoo
35760 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  tPgno ){.       
35770 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
35780 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69   being dropped i
35790 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  s the table with
357a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
357b0 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
357c0 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
357d0 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68  database, put th
357e0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74  e root page on t
357f0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20  he free list. . 
35800 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35810 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
35820 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35830 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
35840 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
35850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35860 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
35870 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
35880 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35890 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
358a0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
358b0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68  does not have th
358c0 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
358d0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
358e0 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
358f0 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74  abase. So move t
35900 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  he page that doe
35910 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  s into the .    
35920 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20      ** gap left 
35930 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72  by the deleted r
35940 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20  oot-page..      
35950 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d    */.        Mem
35960 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20  Page *pMove;.   
35970 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
35980 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
35990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
359a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
359b0 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
359c0 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
359d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
359e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
359f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
35a00 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
35a10 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
35a20 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50  t, pMove, PTRMAP
35a30 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54  _ROOTPAGE, 0, iT
35a40 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
35a50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d    releasePage(pM
35a60 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ove);.        if
35a70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
35a90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
35aa0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
35ab0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
35ac0 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
35ad0 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
35ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
35af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
35b10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
35b20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
35b30 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
35b40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35b50 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
35b60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
35b80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
35b90 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f   }.        *piMo
35ba0 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e  ved = maxRootPgn
35bb0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
35bc0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77    /* Set the new
35bd0 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27   'max-root-page'
35be0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61   value in the da
35bf0 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20 54  tabase header. T
35c00 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  his.      ** is 
35c10 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65  the old value le
35c20 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65  ss one, less one
35c30 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68 61   more if that ha
35c40 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a  ppens to.      *
35c50 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  * be a root-page
35c60 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e   number, less on
35c70 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20  e again if that 
35c80 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
35c90 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35ca0 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  E..      */.    
35cb0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
35cc0 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
35cd0 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  otPgno==PENDING_
35ce0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
35cf0 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
35d00 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
35d10 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
35d20 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50  otPgno==PTRMAP_P
35d30 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f  AGENO(pBt, maxRo
35d40 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  otPgno) ){.     
35d50 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
35d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35d70 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50  assert( maxRootP
35d80 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
35d90 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
35da0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35db0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
35dc0 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50  a(p, 4, maxRootP
35dd0 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gno);.    }else{
35de0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
35df0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
35e00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35e10 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
35e20 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
35e30 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74   /* If sqlite3Bt
35e40 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73  reeDropTable was
35e50 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
35e60 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61  1. */.    zeroPa
35e70 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e  ge(pPage, PTF_IN
35e80 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b  TKEY|PTF_LEAF );
35e90 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
35ea0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
35eb0 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e  eturn rc;  .}.in
35ec0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  t sqlite3BtreeDr
35ed0 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
35ee0 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
35ef0 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
35f00 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
35f10 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
35f20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d   p->pBt->db = p-
35f30 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  >db;.  rc = btre
35f40 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54  eDropTable(p, iT
35f50 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a  able, piMoved);.
35f60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
35f70 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
35f80 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
35f90 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66  ead the meta-inf
35fa0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  ormation out of 
35fb0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
35fc0 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
35fd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
35fe0 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ee pages current
35ff0 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ly in the databa
36000 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20  se.  Meta[1].** 
36010 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d  through meta[15]
36020 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66   are available f
36030 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72  or use by higher
36040 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30   layers.  Meta[0
36050 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ].** is read-onl
36060 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72  y, the others ar
36070 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a  e read/write..**
36080 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20   .** The schema 
36090 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  layer numbers me
360a0 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  ta values differ
360b0 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73  ently.  At the s
360c0 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28  chema.** layer (
360d0 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69  and the SetCooki
360e0 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65  e and ReadCookie
360f0 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75   opcodes) the nu
36100 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20  mber of.** free 
36110 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73  pages is not vis
36120 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65  ible.  So Cookie
36130 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20  [0] is the same 
36140 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69  as Meta[1]..*/.i
36150 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
36160 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  etMeta(Btree *p,
36170 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70   int idx, u32 *p
36180 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20  Meta){.  DbPage 
36190 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20  *pDbPage = 0;.  
361a0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
361b0 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20  ed char *pP1;.  
361c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
361d0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
361e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
361f0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
36200 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e  db;..  /* Readin
36210 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61  g a meta-data va
36220 6c 75 65 20 72 65 71 75 69 72 65 73 20 61 20 72  lue requires a r
36230 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65  ead-lock on page
36240 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20   1 (and hence.  
36250 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
36260 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67  ster table. We g
36270 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65  rab this lock re
36280 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
36290 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20  her or.  ** not 
362a0 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55  the SQLITE_ReadU
362b0 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
362c0 69 73 20 73 65 74 20 28 74 68 65 20 74 61 62 6c  is set (the tabl
362d0 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
362e0 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74  .  ** 1 is treat
362f0 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  ed as a special 
36300 63 61 73 65 20 62 79 20 71 75 65 72 79 53 68 61  case by querySha
36310 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
36320 6b 28 29 0a 20 20 2a 2a 20 61 6e 64 20 73 65 74  k().  ** and set
36330 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
36340 4c 6f 63 6b 28 29 29 2e 0a 20 20 2a 2f 0a 20 20  Lock())..  */.  
36350 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
36360 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
36370 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
36380 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
36390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
363a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
363b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
363c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
363d0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31  idx>=0 && idx<=1
363e0 35 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  5 );.  if( pBt->
363f0 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a  pPage1 ){.    /*
36400 20 54 68 65 20 62 2d 74 72 65 65 20 69 73 20 61   The b-tree is a
36410 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61  lready holding a
36420 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
36430 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
36440 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
36450 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
36460 68 65 20 72 65 71 75 69 72 65 64 20 6d 65 74 61  he required meta
36470 2d 64 61 74 61 20 76 61 6c 75 65 20 63 61 6e 20  -data value can 
36480 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
36490 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
364a0 20 70 61 67 65 20 64 61 74 61 20 6f 66 20 74 68   page data of th
364b0 69 73 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  is reference. Th
364c0 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66  is is slightly f
364d0 61 73 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  aster than.    *
364e0 2a 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 6e  * requesting a n
364f0 65 77 20 72 65 66 65 72 65 6e 63 65 20 66 72 6f  ew reference fro
36500 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
36510 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  r..    */.    pP
36520 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
36530 61 72 20 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  ar *)pBt->pPage1
36540 2d 3e 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65  ->aData;.  }else
36550 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74  {.    /* The b-t
36560 72 65 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ree does not hav
36570 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
36580 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
36590 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
365a0 20 20 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20    ** Obtain one 
365b0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
365c0 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ayer..    */.   
365d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
365e0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
365f0 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b  r, 1, &pDbPage);
36600 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
36610 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
36620 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
36630 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36640 7d 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73  }.    pP1 = (uns
36650 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
36660 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
36670 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
36680 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79   *pMeta = get4by
36690 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
366a0 2a 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  *4]);..  /* If t
366b0 68 65 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 74  he b-tree is not
366c0 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
366d0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 2c 20  ence to page 1, 
366e0 74 68 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20  then one was .  
366f0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
36700 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
36710 72 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 62  r in the above b
36720 6c 6f 63 6b 2e 20 52 65 6c 65 61 73 65 20 69 74  lock. Release it
36730 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
36740 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b   !pBt->pPage1 ){
36750 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
36760 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
36770 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75  .  }..  /* If au
36780 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69  tovacuumed is di
36790 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  sabled in this b
367a0 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20  uild but we are 
367b0 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20  trying to .  ** 
367c0 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61  access an autova
367d0 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c  cuumed database,
367e0 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64   then make the d
367f0 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79  atabase readonly
36800 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  . .  */.#ifdef S
36810 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
36820 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d  ACUUM.  if( idx=
36830 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29  =4 && *pMeta>0 )
36840 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
36850 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   1;.#endif..  /*
36860 20 49 66 20 74 68 65 72 65 20 69 73 20 63 75 72   If there is cur
36870 72 65 6e 74 6c 79 20 61 6e 20 6f 70 65 6e 20 74  rently an open t
36880 72 61 6e 73 61 63 74 69 6f 6e 2c 20 67 72 61 62  ransaction, grab
36890 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 20 20   a read-lock .  
368a0 2a 2a 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 20  ** on page 1 of 
368b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
368c0 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
368d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
368e0 74 0a 20 20 2a 2a 20 6e 6f 20 6f 74 68 65 72 20  t.  ** no other 
368f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6d  connection can m
36900 6f 64 69 66 79 20 74 68 65 20 6d 65 74 61 20 76  odify the meta v
36910 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 66  alue just read f
36920 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  rom.  ** the dat
36930 61 62 61 73 65 20 75 6e 74 69 6c 20 74 68 65 20  abase until the 
36940 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
36950 6f 6e 63 6c 75 64 65 64 2e 0a 20 20 2a 2f 0a 20  oncluded..  */. 
36960 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
36970 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  0 ){.    rc = se
36980 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
36990 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44  eLock(p, 1, READ
369a0 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 73 71  _LOCK);.  }.  sq
369b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
369c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
369d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
369e0 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
369f0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
36a00 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30  atabase.  Meta[0
36a10 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c  ] is.** read-onl
36a20 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65  y and may not be
36a30 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74   written..*/.int
36a40 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
36a50 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70  ateMeta(Btree *p
36a60 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69  , int idx, u32 i
36a70 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65  Meta){.  BtShare
36a80 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
36a90 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
36aa0 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b   *pP1;.  int rc;
36ab0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
36ac0 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  1 && idx<=15 );.
36ad0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
36ae0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
36af0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
36b00 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
36b10 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
36b20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
36b30 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50  Page1!=0 );.  pP
36b40 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  1 = pBt->pPage1-
36b50 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
36b60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36b70 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
36b80 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
36b90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36ba0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 31     put4byte(&pP1
36bb0 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d  [36 + idx*4], iM
36bc0 65 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  eta);.#ifndef SQ
36bd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
36be0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 69 64 78  CUUM.    if( idx
36bf0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
36c00 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
36c10 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30  cuum || iMeta==0
36c20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
36c30 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d  ( iMeta==0 || iM
36c40 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  eta==1 );.      
36c50 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
36c60 3d 20 28 75 38 29 69 4d 65 74 61 3b 0a 20 20 20  = (u8)iMeta;.   
36c70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
36c80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
36c90 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
36ca0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
36cb0 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65  rn the flag byte
36cc0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
36cd0 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  g of the page th
36ce0 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
36cf0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
36d00 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
36d10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c  t sqlite3BtreeFl
36d20 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ags(BtCursor *pC
36d30 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
36d40 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f  What about CURSO
36d50 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
36d60 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65  ate? Probably ne
36d70 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20  ed to call.  ** 
36d80 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
36d90 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
36da0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
36db0 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43 75  age;.  restoreCu
36dc0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
36dd0 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  r);.  pPage = pC
36de0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
36df0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
36e00 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
36e10 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
36e20 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20  ssert( pPage!=0 
36e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36e40 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70  ge->pBt==pCur->p
36e50 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Bt );.  return p
36e60 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
36e70 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 3b 0a 7d  e->hdrOffset];.}
36e80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
36e90 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
36ea0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
36eb0 20 61 72 67 75 6d 65 6e 74 2c 20 70 43 75 72 2c   argument, pCur,
36ec0 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65   is a cursor ope
36ed0 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 62 2d 74 72  ned on some b-tr
36ee0 65 65 2e 20 43 6f 75 6e 74 20 74 68 65 0a 2a 2a  ee. Count the.**
36ef0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
36f00 65 73 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  es in the b-tree
36f10 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 72   and write the r
36f20 65 73 75 6c 74 20 74 6f 20 2a 70 6e 45 6e 74 72  esult to *pnEntr
36f30 79 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  y..**.** SQLITE_
36f40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
36f50 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
36f60 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
36f70 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 4f 74  executed. .** Ot
36f80 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
36f90 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
36fa0 72 65 64 20 28 69 2e 65 2e 20 61 6e 20 49 4f 20  red (i.e. an IO 
36fb0 65 72 72 6f 72 20 6f 72 20 64 61 74 61 62 61 73  error or databas
36fc0 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 29  e.** corruption)
36fd0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
36fe0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
36ff0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
37000 33 42 74 72 65 65 43 6f 75 6e 74 28 42 74 43 75  3BtreeCount(BtCu
37010 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
37020 2a 70 6e 45 6e 74 72 79 29 7b 0a 20 20 69 36 34  *pnEntry){.  i64
37030 20 6e 45 6e 74 72 79 20 3d 20 30 3b 20 20 20 20   nEntry = 0;    
37040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37050 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
37060 74 75 72 6e 20 69 6e 20 2a 70 6e 45 6e 74 72 79  turn in *pnEntry
37070 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
37080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
370a0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 72  turn code */.  r
370b0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
370c0 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65  Cur);..  /* Unle
370d0 73 73 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ss an error occu
370e0 72 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rs, the followin
370f0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 65 20  g loop runs one 
37100 69 74 65 72 61 74 69 6f 6e 20 66 6f 72 20 65 61  iteration for ea
37110 63 68 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  ch.  ** page in 
37120 74 68 65 20 42 2d 54 72 65 65 20 73 74 72 75 63  the B-Tree struc
37130 74 75 72 65 20 28 6e 6f 74 20 69 6e 63 6c 75 64  ture (not includ
37140 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
37150 65 73 29 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  es). .  */.  whi
37160 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
37170 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  K ){.    int iId
37180 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
37190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
371a0 6e 64 65 78 20 6f 66 20 63 68 69 6c 64 20 6e 6f  ndex of child no
371b0 64 65 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  de in parent */.
371c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
371d0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
371e0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
371f0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
37200 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  tree */..    /* 
37210 49 66 20 74 68 69 73 20 69 73 20 61 20 6c 65 61  If this is a lea
37220 66 20 70 61 67 65 20 6f 72 20 74 68 65 20 74 72  f page or the tr
37230 65 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  ee is not an int
37240 2d 6b 65 79 20 74 72 65 65 2c 20 74 68 65 6e 20  -key tree, then 
37250 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 70 61 67  .    ** this pag
37260 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 75 6e 74  e contains count
37270 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 49 6e  able entries. In
37280 63 72 65 6d 65 6e 74 20 74 68 65 20 65 6e 74 72  crement the entr
37290 79 20 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a  y counter.    **
372a0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 20 20   accordingly..  
372b0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 20 3d    */.    pPage =
372c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
372d0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
372e0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
372f0 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || !pPage->intKe
37300 79 20 29 7b 0a 20 20 20 20 20 20 6e 45 6e 74 72  y ){.      nEntr
37310 79 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  y += pPage->nCel
37320 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  l;.    }..    /*
37330 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
37340 20 6e 6f 64 65 2e 20 54 68 69 73 20 6c 6f 6f 70   node. This loop
37350 20 6e 61 76 69 67 61 74 65 73 20 74 68 65 20 63   navigates the c
37360 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
37370 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20   .    ** points 
37380 74 6f 20 74 68 65 20 66 69 72 73 74 20 69 6e 74  to the first int
37390 65 72 69 6f 72 20 63 65 6c 6c 20 74 68 61 74 20  erior cell that 
373a0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
373b0 20 70 61 72 65 6e 74 20 6f 66 0a 20 20 20 20 2a   parent of.    *
373c0 2a 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  * the next page 
373d0 69 6e 20 74 68 65 20 74 72 65 65 20 74 68 61 74  in the tree that
373e0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
373f0 6e 20 76 69 73 69 74 65 64 2e 20 54 68 65 0a 20  n visited. The. 
37400 20 20 20 2a 2a 20 70 43 75 72 2d 3e 61 69 49 64     ** pCur->aiId
37410 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 76  x[pCur->iPage] v
37420 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74  alue is set to t
37430 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
37440 70 61 72 65 6e 74 20 63 65 6c 6c 0a 20 20 20 20  parent cell.    
37450 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
37460 6f 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  or to the number
37470 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 74 68 65   of cells in the
37480 20 70 61 67 65 20 69 66 20 74 68 65 20 6e 65 78   page if the nex
37490 74 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 6f  t page.    ** to
374a0 20 76 69 73 69 74 20 69 73 20 74 68 65 20 72 69   visit is the ri
374b0 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 69 74 73  ght-child of its
374c0 20 70 61 72 65 6e 74 2e 0a 20 20 20 20 2a 2a 0a   parent..    **.
374d0 20 20 20 20 2a 2a 20 49 66 20 61 6c 6c 20 70 61      ** If all pa
374e0 67 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  ges in the tree 
374f0 68 61 76 65 20 62 65 65 6e 20 76 69 73 69 74 65  have been visite
37500 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
37510 5f 4f 4b 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  _OK to the.    *
37520 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2f  * caller..    */
37530 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
37540 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 64 6f  leaf ){.      do
37550 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
37560 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
37570 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
37580 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 62  l pages of the b
37590 2d 74 72 65 65 20 68 61 76 65 20 62 65 65 6e 20  -tree have been 
375a0 76 69 73 69 74 65 64 2e 20 52 65 74 75 72 6e 20  visited. Return 
375b0 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 2a 2f  successfully. */
375c0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 45 6e  .          *pnEn
375d0 74 72 79 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20  try = nEntry;.  
375e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
375f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
37600 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
37610 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
37620 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
37630 20 20 7d 77 68 69 6c 65 20 28 20 70 43 75 72 2d    }while ( pCur-
37640 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
37650 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]>=pCur->apPag
37660 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
37670 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 20 20  nCell );..      
37680 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
37690 2d 3e 69 50 61 67 65 5d 2b 2b 3b 0a 20 20 20 20  ->iPage]++;.    
376a0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
376b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
376c0 67 65 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge];.    }..    
376d0 2f 2a 20 44 65 73 63 65 6e 64 20 74 6f 20 74 68  /* Descend to th
376e0 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 6f 66 20  e child node of 
376f0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 74 68  the cell that th
37700 65 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  e cursor current
37710 6c 79 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ly .    ** point
37720 73 20 61 74 2e 20 54 68 69 73 20 69 73 20 74 68  s at. This is th
37730 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 66  e right-child if
37740 20 28 69 49 64 78 3d 3d 70 50 61 67 65 2d 3e 6e   (iIdx==pPage->n
37750 43 65 6c 6c 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  Cell)..    */.  
37760 20 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61    iIdx = pCur->a
37770 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
37780 5d 3b 0a 20 20 20 20 69 66 28 20 69 49 64 78 3d  ];.    if( iIdx=
37790 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
377a0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
377b0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
377c0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
377d0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
377e0 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
377f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
37800 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
37810 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
37820 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 49 64  dCell(pPage, iId
37830 78 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  x)));.    }.  }.
37840 0a 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68  .  /* An error h
37850 61 73 20 6f 63 63 75 72 72 65 64 2e 20 52 65 74  as occurred. Ret
37860 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
37870 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  e. */.  return r
37880 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
37890 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
378a0 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
378b0 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68  ith a BTree.  Th
378c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
378d0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
378e0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
378f0 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a  only..*/.Pager *
37900 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
37910 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  r(Btree *p){.  r
37920 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50  eturn p->pBt->pP
37930 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ager;.}..#ifndef
37940 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
37950 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
37960 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
37970 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
37980 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
37990 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
379a0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
379b0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
379c0 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
379d0 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
379e0 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
379f0 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
37a00 61 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63  ap;.  if( !pChec
37a10 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72  k->mxErr ) retur
37a20 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45  n;.  pCheck->mxE
37a30 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  rr--;.  pCheck->
37a40 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61  nErr++;.  va_sta
37a50 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
37a60 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65  .  if( pCheck->e
37a70 72 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20  rrMsg.nChar ){. 
37a80 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
37a90 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b  umAppend(&pCheck
37aa0 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20  ->errMsg, "\n", 
37ab0 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  1);.  }.  if( zM
37ac0 73 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sg1 ){.    sqlit
37ad0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
37ae0 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  (&pCheck->errMsg
37af0 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20  , zMsg1, -1);.  
37b00 7d 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69  }.  sqlite3VXPri
37b10 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72  ntf(&pCheck->err
37b20 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c  Msg, 1, zFormat,
37b30 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
37b40 70 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  p);.  if( pCheck
37b50 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46  ->errMsg.mallocF
37b60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43 68  ailed ){.    pCh
37b70 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  eck->mallocFaile
37b80 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d = 1;.  }.}.#en
37b90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
37ba0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
37bb0 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
37bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
37bd0 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
37be0 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65   Add 1 to the re
37bf0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
37c00 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49  r page iPage.  I
37c10 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  f this is the se
37c20 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63  cond.** referenc
37c30 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61  e to the page, a
37c40 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
37c50 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a  age to pCheck->z
37c60 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72  ErrMsg..** Retur
37c70 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65  n 1 if there are
37c80 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65   2 ore more refe
37c90 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
37ca0 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69  ge and 0 if.** i
37cb0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
37cc0 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  rst reference to
37cd0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
37ce0 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
37cf0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
37d00 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a   is in bounds..*
37d10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
37d20 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43  ckRef(IntegrityC
37d30 6b 20 2a 70 43 68 65 63 6b 2c 20 50 67 6e 6f 20  k *pCheck, Pgno 
37d40 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f  iPage, char *zCo
37d50 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50  ntext){.  if( iP
37d60 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
37d70 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70  1;.  if( iPage>p
37d80 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 29 7b 0a  Check->nPage ){.
37d90 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
37da0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
37db0 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61  ext, "invalid pa
37dc0 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69  ge number %d", i
37dd0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
37de0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
37df0 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
37e00 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68  ge]==1 ){.    ch
37e10 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
37e20 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
37e30 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f  2nd reference to
37e40 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
37e50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
37e60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28  .  }.  return  (
37e70 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
37e80 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69  age]++)>1;.}..#i
37e90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37ea0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
37eb0 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
37ec0 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  e entry in the p
37ed0 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70  ointer-map for p
37ee0 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20  age iChild maps 
37ef0 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72  to .** page iPar
37f00 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70  ent, pointer typ
37f10 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f  e ptrType. If no
37f20 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72  t, append an err
37f30 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f  or message.** to
37f40 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74   pCheck..*/.stat
37f50 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72  ic void checkPtr
37f60 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79  map(.  Integrity
37f70 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a  Ck *pCheck,   /*
37f80 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
37f90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67   context */.  Pg
37fa0 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
37fb0 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61       /* Child pa
37fc0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75  ge number */.  u
37fd0 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
37fe0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
37ff0 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79  d pointer map ty
38000 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61  pe */.  Pgno iPa
38010 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f  rent,          /
38020 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
38030 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61  er map parent pa
38040 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
38050 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
38060 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
38070 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73   description (us
38080 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67  ed for error msg
38090 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
380a0 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79  ;.  u8 ePtrmapTy
380b0 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d  pe;.  Pgno iPtrm
380c0 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20  apParent;..  rc 
380d0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65  = ptrmapGet(pChe
380e0 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c  ck->pBt, iChild,
380f0 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26   &ePtrmapType, &
38100 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
38110 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38120 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
38130 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
38140 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63  ) pCheck->malloc
38150 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
38160 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
38170 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
38180 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64   "Failed to read
38190 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c   ptrmap key=%d",
381a0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65   iChild);.    re
381b0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
381c0 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54   ePtrmapType!=eT
381d0 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61  ype || iPtrmapPa
381e0 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b  rent!=iParent ){
381f0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
38200 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
38210 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61  text, .      "Ba
38220 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20  d ptr map entry 
38230 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d  key=%d expected=
38240 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c  (%d,%d) got=(%d,
38250 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68  %d)", .      iCh
38260 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72  ild, eType, iPar
38270 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65  ent, ePtrmapType
38280 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29  , iPtrmapParent)
38290 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
382a0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
382b0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
382c0 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20   freelist or of 
382d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
382e0 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79   list..** Verify
382f0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
38300 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
38310 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73   list is N..*/.s
38320 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
38330 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74  List(.  Integrit
38340 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
38350 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
38360 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
38370 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c   int isFreeList,
38380 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
38390 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20  or a freelist.  
383a0 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c  False for overfl
383b0 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ow page list */.
383c0 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
383d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
383e0 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74  number for first
383f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
38400 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
38410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38420 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  Expected number 
38430 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
38440 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
38450 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
38460 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65  /* Context for e
38470 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rr