/ Hex Artifact Content
Login

Artifact bb9dbeaf781544314e181ffe81275a7db31acb30:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 36 31 39 20 32 30 30 39 2f 30  c,v 1.619 2009/0
0190: 36 2f 30 35 20 31 38 3a 34 34 3a 31 35 20 64 72  6/05 18:44:15 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: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
48b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
48c0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
48d0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
48e0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
48f0: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
4900: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
4910: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
4920: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
4930: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
4940: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
4950: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
4960: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
4970: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
4980: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
4990: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
49a0: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
49b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
49c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
49d0: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
49e0: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
49f0: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
4a00: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
4a10: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
4a20: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
4a30: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
4a40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4a50: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
4a60: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
4a70: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
4a80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
4a90: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
4aa0: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
4ab0: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
4ac0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
4ad0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
4ae0: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
4af0: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
4b00: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
4b10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
4b20: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
4b30: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4b40: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
4b50: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
4b60: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
4b70: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4b80: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
4b90: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
4ba0: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
4bb0: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
4bc0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
4bd0: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
4be0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4bf0: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
4c00: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
4c10: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
4c20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
4c30: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
4c40: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
4c50: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
4c60: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
4c70: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
4c80: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
4c90: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
4ca0: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
4cb0: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
4cc0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
4cd0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
4ce0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
4cf0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
4d00: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
4d10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
4d20: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
4d30: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
4d40: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
4d50: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
4d60: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
4d70: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
4d80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
4d90: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
4da0: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
4db0: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
4dc0: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
4dd0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
4de0: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
4df0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
4e00: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
4e10: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
4e20: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
4e30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
4e40: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
4e50: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
4e60: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
4e70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
4e80: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
4e90: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
4ea0: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
4eb0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
4ec0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
4ed0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
4ee0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  e ptrmapPutOvfl(
4ef0: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  y,z) SQLITE_OK.#
4f00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
4f10: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
4f20: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
4f30: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
4f40: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
4f50: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
4f60: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
4f70: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
4f80: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
4f90: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
4fa0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
4fb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
4fc0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
4fd0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
4fe0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
4ff0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
5000: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
5010: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
5020: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
5030: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
5040: 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f  aData[(P)->cellO
5050: 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a  ffset+2*(I)]))).
5060: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
5070: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
5080: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
5090: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
50a0: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
50b0: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
50c0: 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e  w cells.  See in
50d0: 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75  sert.*/.static u
50e0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
50f0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
5100: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
5110: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
5120: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5130: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
5140: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
5150: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
5160: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
5170: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
5180: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
5190: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
51a0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
51b0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
51c0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
51d0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
51e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
51f0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
5200: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
5210: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
5220: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
5230: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
5240: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
5250: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
5260: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
5270: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
5280: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
5290: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
52a0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
52b0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
52c0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c  s function.  sql
52d0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
52e0: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
52f0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
5300: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
5310: 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  nt and sqlite3Bt
5320: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
5330: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
5340: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
5350: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
5360: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
5370: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
5380: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
5390: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
53a0: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
53b0: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
53c0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
53d0: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
53e0: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
53f0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
5400: 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  aster..*/.void s
5410: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
5420: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
5430: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
5440: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
5450: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
5460: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5480: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
5490: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
54a0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
54b0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
54c0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
54d0: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20  */.){.  u16 n;  
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
5500: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
5510: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
5520: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
5530: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5540: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
5550: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
5560: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5570: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5580: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
5590: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
55a0: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
55b0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
55c0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
55d0: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
55e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
55f0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
5600: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
5610: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
5620: 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
5630: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
5640: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  .      n += getV
5650: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
5660: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
5670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
5680: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
5690: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
56a0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
56b0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
56c0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
56d0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
56e0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
56f0: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
5700: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
5710: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
5720: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
5730: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
5740: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
5750: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
5760: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
5770: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
5780: 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50  .  if( likely(nP
5790: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
57a0: 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20  axLocal) ){.    
57b0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
57c0: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
57d0: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
57e0: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
57f0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
5800: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
5810: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
5820: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
5830: 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  nt nSize;       
5840: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
5850: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
5860: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
5870: 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61   nSize = nPayloa
5880: 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f  d + n;.    pInfo
5890: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
58a0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
58b0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
58c0: 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69   0;.    if( (nSi
58d0: 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20  ze & ~3)==0 ){. 
58e0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20       nSize = 4; 
58f0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
5900: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
5910: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49   */.    }.    pI
5920: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31  nfo->nSize = (u1
5930: 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65  6)nSize;.  }else
5940: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
5950: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
5960: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
5970: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
5980: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
5990: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
59a0: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
59b0: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
59c0: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
59d0: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
59e0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
59f0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
5a00: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
5a10: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
5a20: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
5a30: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
5a40: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
5a50: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
5a60: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
5a70: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
5a80: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
5a90: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
5aa0: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
5ab0: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
5ac0: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
5ad0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
5ae0: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
5af0: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
5b00: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
5b10: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
5b20: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
5b30: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
5b40: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
5b50: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
5b60: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
5b70: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
5b80: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
5b90: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
5ba0: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
5bb0: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
5bc0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
5bd0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
5be0: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
5bf0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
5c00: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
5c10: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
5c20: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
5c30: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
5c40: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
5c50: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
5c60: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
5c70: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
5c80: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
5c90: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
5ca0: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
5cb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5cc0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
5cd0: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
5ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
5cf0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
5d00: 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  16)(pInfo->nLoca
5d10: 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66  l + n);.    pInf
5d20: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
5d30: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
5d40: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70  .  }.}.#define p
5d50: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
5d60: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a  iCell, pInfo) \.
5d70: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
5d80: 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67  rseCellPtr((pPag
5d90: 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50  e), findCell((pP
5da0: 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20  age), (iCell)), 
5db0: 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73 71  (pInfo)).void sq
5dc0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
5dd0: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
5de0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
5df0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
5e00: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
5e10: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
5e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
5e30: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
5e40: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
5e50: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
5e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
5e70: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
5e80: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
5e90: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
5ea0: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  l, pInfo);.}../*
5eb0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
5ec0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
5ed0: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
5ee0: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
5ef0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
5f00: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
5f10: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
5f20: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
5f30: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
5f40: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
5f50: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
5f60: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
5f70: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
5f80: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
5f90: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
5fa0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  r..*/.static u16
5fb0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
5fc0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
5fd0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
5fe0: 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50  Iter = &pCell[pP
5ff0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
6000: 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b  e];.  u32 nSize;
6010: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6020: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
6030: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
6040: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
6050: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
6060: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
6070: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
6080: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
6090: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
60a0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
60b0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
60c0: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
60d0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
60e0: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
60f0: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
6100: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
6110: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
6120: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
6130: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
6140: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 73  o debuginfo;.  s
6150: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
6160: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
6170: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
6180: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
6190: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
61a0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
61b0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
61c0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
61d0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
61e0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
61f0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
6200: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
6210: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
6220: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
6230: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
6240: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
6250: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
6260: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
6270: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
6280: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
6290: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
62a0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
62b0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
62c0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
62d0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
62e0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
62f0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
6300: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
6310: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
6320: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
6330: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
6340: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
6350: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
6360: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
6370: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
6380: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
6390: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
63a0: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
63b0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
63c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
63d0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
63e0: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
63f0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
6400: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
6410: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
6420: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
6430: 20 6e 53 69 7a 65 20 2b 3d 20 28 70 49 74 65 72   nSize += (pIter
6440: 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a   - pCell);..  /*
6450: 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   The minimum siz
6460: 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73  e of any cell is
6470: 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69   4 bytes. */.  i
6480: 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20  f( nSize<4 ){.  
6490: 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d    nSize = 4;.  }
64a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  ..  assert( nSiz
64b0: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
64c0: 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ze );.  return (
64d0: 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23 69 66  u16)nSize;.}.#if
64e0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
64f0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
6500: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6510: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
6520: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
6530: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
6540: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
6550: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
6560: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
6570: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
6580: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
6590: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
65a0: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
65b0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
65c0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
65d0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
65e0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
65f0: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
6600: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
6610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
6620: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
6630: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
6640: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  8 *pCell){.  Cel
6650: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73  lInfo info;.  as
6660: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
6670: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
6680: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
6690: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
66a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
66b0: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
66c0: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
66d0: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
66e0: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69  load );.  if( (i
66f0: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
6700: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
6710: 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
6720: 61 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  al ){.    Pgno o
6730: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
6740: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
6750: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75  flow]);.    retu
6760: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
6770: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
6780: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
6790: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
67a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
67b0: 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49  TE_OK;.}./*.** I
67c0: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  f the cell with 
67d0: 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70  index iCell on p
67e0: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
67f0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
6800: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
6810: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
6820: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
6830: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
6840: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
6850: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
6860: 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  t ptrmapPutOvfl(
6870: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6880: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
6890: 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72   *pCell;.  asser
68a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
68b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
68c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43  ->mutex) );.  pC
68d0: 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ell = findOverfl
68e0: 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  owCell(pPage, iC
68f0: 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ell);.  return p
6900: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
6910: 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d  pPage, pCell);.}
6920: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
6930: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
6940: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
6950: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
6960: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
6970: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
6980: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
6990: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
69a0: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
69b0: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
69c0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
69d0: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
69e0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
69f0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
6a00: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
6a10: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
6a20: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
6a30: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
6a60: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
6a90: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
6aa0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ac0: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
6ad0: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
6ae0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
6af0: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6b10: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
6b20: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
6b30: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6b50: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
6b60: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
6b70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
6b80: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
6b90: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
6ba0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
6bb0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
6bc0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
6bd0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
6be0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
6bf0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
6c00: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6c10: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6c20: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
6c30: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
6c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6c50: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
6c60: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
6c70: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
6c80: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
6c90: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
6ca0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
6cb0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
6cc0: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
6cd0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
6ce0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
6cf0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
6d00: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
6d10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
6d20: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
6d30: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
6d40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
6d50: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
6d60: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
6d70: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
6d80: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
6d90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6da0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
6db0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
6dc0: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
6dd0: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
6de0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
6df0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
6e00: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
6e10: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
6e20: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
6e30: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
6e40: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
6e50: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
6e60: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
6e70: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
6e80: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
6e90: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
6ea0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62  usableSize;.  cb
6eb0: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
6ec0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
6ed0: 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b  emcpy(&temp[cbrk
6ee0: 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ], &data[cbrk], 
6ef0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72  usableSize - cbr
6f00: 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  k);.  cbrk = usa
6f10: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
6f20: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
6f30: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
6f40: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
6f50: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
6f60: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
6f70: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
6f80: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
6f90: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
6fa0: 0a 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73 61  .    if( pc>=usa
6fb0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
6fc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6fd0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6fe0: 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65   }.    size = ce
6ff0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
7000: 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20   &temp[pc]);.   
7010: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
7020: 20 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c     if( cbrk<cell
7030: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c  Offset+2*nCell |
7040: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
7050: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
7060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7070: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
7080: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
7090: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
70a0: 65 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a  e && cbrk>=0 );.
70b0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
70c0: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
70d0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
70e0: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
70f0: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
7100: 74 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66  t( cbrk>=cellOff
7110: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20  set+2*nCell );. 
7120: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
7130: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
7140: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
7150: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
7160: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
7170: 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d  7] = 0;.  addr =
7180: 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43   cellOffset+2*nC
7190: 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ell;.  memset(&d
71a0: 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62  ata[addr], 0, cb
71b0: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73 65  rk-addr);.  asse
71c0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
71d0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
71e0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
71f0: 20 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21 3d   if( cbrk-addr!=
7200: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
7210: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7220: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7230: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7240: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7250: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
7260: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
7270: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
7280: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
7290: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
72a0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
72b0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
72c0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
72d0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 69 72 73   of the .** firs
72e0: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
72f0: 74 65 64 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a  ted space. .**.*
7300: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
7310: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
7320: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 74   space between t
7330: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 65  he end of the ce
7340: 6c 6c 2d 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72  ll-offset .** ar
7350: 72 61 79 20 61 6e 64 20 74 68 65 20 73 74 61 72  ray and the star
7360: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
7370: 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 61 74  ntent area is at
7380: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
7390: 65 73 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53  es.** in size. S
73a0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  o this routine c
73b0: 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a  an never fail..*
73c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
73d0: 65 20 61 6c 72 65 61 64 79 20 36 30 20 6f 72 20  e already 60 or 
73e0: 6d 6f 72 65 20 62 79 74 65 73 20 6f 66 20 66 72  more bytes of fr
73f0: 61 67 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74  agments within t
7400: 68 65 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20  he page,.** the 
7410: 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65  page is defragme
7420: 6e 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  nted before retu
7430: 72 6e 69 6e 67 2e 20 49 66 20 74 68 69 73 20 77  rning. If this w
7440: 65 72 65 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65  ere not done the
7450: 72 65 0a 2a 2a 20 69 73 20 61 20 63 68 61 6e 63  re.** is a chanc
7460: 65 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  e that the numbe
7470: 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20  r of fragmented 
7480: 62 79 74 65 73 20 63 6f 75 6c 64 20 65 76 65 6e  bytes could even
7490: 74 75 61 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66  tually .** overf
74a0: 6c 6f 77 20 74 68 65 20 73 69 6e 67 6c 65 2d 62  low the single-b
74b0: 79 74 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  yte field of the
74c0: 20 70 61 67 65 2d 68 65 61 64 65 72 20 69 6e 20   page-header in 
74d0: 77 68 69 63 68 20 74 68 69 73 20 76 61 6c 75 65  which this value
74e0: 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a  .** is stored..*
74f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
7500: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
7510: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
7520: 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69  Byte){.  const i
7530: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
7540: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
7550: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
7560: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
7570: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
7580: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
7590: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
75a0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
75b0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
75c0: 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20  nt nFrag;       
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
75f0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
7600: 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  s on pPage */.  
7610: 69 6e 74 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73  int top;.  .  as
7620: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7630: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
7640: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
7650: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7660: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
7670: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7680: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7690: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
76a0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
76b0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
76c0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
76d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
76e0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
76f0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7700: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
7710: 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
7720: 68 61 74 20 74 68 65 20 73 70 61 63 65 20 62 65  hat the space be
7730: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f  tween the cell-o
7740: 66 66 73 65 74 20 61 72 72 61 79 20 61 6e 64 20  ffset array and 
7750: 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63  the .  ** cell-c
7760: 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 67  ontent area is g
7770: 72 65 61 74 65 72 20 74 68 61 6e 20 6e 42 79 74  reater than nByt
7780: 65 20 62 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20  e bytes..  */.  
7790: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 3d  assert( nByte <=
77a0: 20 28 0a 20 20 20 20 20 20 67 65 74 32 62 79 74   (.      get2byt
77b0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d  e(&data[hdr+5])-
77c0: 28 68 64 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c  (hdr+8+(pPage->l
77d0: 65 61 66 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62  eaf?0:4)+2*get2b
77e0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
77f0: 29 29 0a 20 20 29 29 3b 0a 0a 20 20 70 50 61 67  )).  ));..  pPag
7800: 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
7810: 29 6e 42 79 74 65 3b 0a 20 20 6e 46 72 61 67 20  )nByte;.  nFrag 
7820: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
7830: 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29   if( nFrag>=60 )
7840: 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65 6e 74  {.    defragment
7850: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
7860: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61  else{.    /* Sea
7870: 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  rch the freelist
7880: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
7890: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
78a0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 0a  ugh to satisfy .
78b0: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
78c0: 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74 69  st. The allocati
78d0: 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d 20  on is made from 
78e0: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 73  the first free s
78f0: 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  lot in .    ** t
7900: 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
7910: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
7920: 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20  accomadate it.. 
7930: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63     */.    int pc
7940: 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72 28  , addr;.    for(
7950: 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63 20  addr=hdr+1; (pc 
7960: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
7970: 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64 72  [addr]))>0; addr
7980: 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =pc){.      int 
7990: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
79a0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20  &data[pc+2]);   
79b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66 72 65    /* Size of fre
79c0: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  e slot */.      
79d0: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
79e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
79f0: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
7a00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 34  .        if( x<4
7a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
7a20: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
7a30: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
7a40: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
7a50: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
7a60: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
7a70: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
7a80: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
7a90: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
7aa0: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
7ab0: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
7ac0: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
7ad0: 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29   (u8)(nFrag + x)
7ae0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7af0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
7b00: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
7b10: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
7b20: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
7b30: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
7b40: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
7b50: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
7b60: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
7b70: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
7b80: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
7b90: 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  [pc+2], x);.    
7ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
7bb0: 74 75 72 6e 20 70 63 20 2b 20 78 3b 0a 20 20 20  turn pc + x;.   
7bc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7bd0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
7be0: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
7bf0: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
7c00: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
7c10: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
7c20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
7c30: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
7c40: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7c50: 68 64 72 2b 35 5d 29 20 2d 20 6e 42 79 74 65 3b  hdr+5]) - nByte;
7c60: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7c70: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
7c80: 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a    return top;.}.
7c90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7ca0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
7cb0: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
7cc0: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
7cd0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
7ce0: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
7cf0: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
7d00: 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61  Disk[start].** a
7d10: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
7d20: 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a  he block is "siz
7d30: 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  e" bytes..**.** 
7d40: 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f  Most of the effo
7d50: 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c  rt here is invol
7d60: 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67  ved in coalesing
7d70: 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65   adjacent.** fre
7d80: 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20  e blocks into a 
7d90: 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20  single big free 
7da0: 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  block..*/.static
7db0: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
7dc0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
7dd0: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
7de0: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
7df0: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
7e00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
7e10: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
7e20: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
7e30: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
7e40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7e50: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
7e60: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
7e70: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
7e80: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
7e90: 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
7ea0: 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20  >leaf?0:4) );.  
7eb0: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
7ec0: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
7ed0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
7ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7ef0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7f00: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
7f10: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
7f20: 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d  ize>=0 );   /* M
7f30: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
7f40: 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66   is 4 */..#ifdef
7f50: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
7f60: 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77  ELETE.  /* Overw
7f70: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
7f80: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
7f90: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43  ros when the SEC
7fa0: 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a  URE_DELETE .  **
7fb0: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
7fc0: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
7fd0: 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  me */.  memset(&
7fe0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
7ff0: 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  size);.#endif.. 
8000: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
8010: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
8020: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
8030: 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68  reeblocks */.  h
8040: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8050: 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20  ffset;.  addr = 
8060: 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  hdr + 1;.  while
8070: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
8080: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
8090: 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67  ))<start && pbeg
80a0: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  in>0 ){.    asse
80b0: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
80c0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
80d0: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69 66 28 20  ze-4 );.    if( 
80e0: 70 62 65 67 69 6e 3c 3d 61 64 64 72 20 29 20 7b  pbegin<=addr ) {
80f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8100: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8110: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  T;.    }.    add
8120: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a  r = pbegin;.  }.
8130: 20 20 69 66 20 28 20 70 62 65 67 69 6e 3e 70 50    if ( pbegin>pP
8140: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8150: 53 69 7a 65 2d 34 20 29 20 7b 0a 20 20 20 20 72  Size-4 ) {.    r
8160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8170: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
8180: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
8190: 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d  addr || pbegin==
81a0: 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  0 );.  put2byte(
81b0: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61  &data[addr], sta
81c0: 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  rt);.  put2byte(
81d0: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62  &data[start], pb
81e0: 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74  egin);.  put2byt
81f0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d  e(&data[start+2]
8200: 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  , size);.  pPage
8210: 2d 3e 6e 46 72 65 65 20 2b 3d 20 28 75 31 36 29  ->nFree += (u16)
8220: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
8230: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
8240: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
8250: 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  ddr = pPage->hdr
8260: 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68  Offset + 1;.  wh
8270: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
8280: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
8290: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
82a0: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
82b0: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
82c0: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
82d0: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
82e0: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
82f0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
8300: 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62     pnext = get2b
8310: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
8320: 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20  ]);.    psize = 
8330: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
8340: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69  begin+2]);.    i
8350: 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a  f( pbegin + psiz
8360: 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26  e + 3 >= pnext &
8370: 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  & pnext>0 ){.   
8380: 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e     int frag = pn
8390: 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73  ext - (pbegin+ps
83a0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
83b0: 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61  (frag<0) || (fra
83c0: 67 3e 28 69 6e 74 29 64 61 74 61 5b 70 50 61 67  g>(int)data[pPag
83d0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 29  e->hdrOffset+7])
83e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
83f0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8400: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
8410: 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65        data[pPage
8420: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d  ->hdrOffset+7] -
8430: 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20 20  = (u8)frag;.    
8440: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
8450: 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20  data[pnext]);.  
8460: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
8470: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a  ta[pbegin], x);.
8480: 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20        x = pnext 
8490: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
84a0: 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65  [pnext+2]) - pbe
84b0: 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32 62  gin;.      put2b
84c0: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
84d0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c  +2], x);.    }el
84e0: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
84f0: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
8500: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
8510: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
8520: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
8530: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
8540: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
8550: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
8560: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
8570: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
8580: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
8590: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
85a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
85b0: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
85c0: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
85d0: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
85e0: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
85f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
8600: 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74 65  r+5]) + get2byte
8610: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
8620: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
8630: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
8640: 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  p);.  }.  assert
8650: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8660: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8670: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
8680: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
86a0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
86b0: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
86c0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
86d0: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
86e0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
86f0: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
8700: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
8710: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
8720: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
8730: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
8740: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
8750: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
8760: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
8770: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
8780: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
8790: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
87a0: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
87b0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
87c0: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
87d0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
87e0: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
87f0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
8800: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
8810: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
8820: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
8830: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
8840: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
8850: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
8860: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
8870: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
8880: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
8890: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
88a0: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
88b0: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
88c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
88d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
88e0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
88f0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
8900: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
8910: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
8920: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
8930: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
8940: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
8950: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
8960: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
8970: 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  eaf;.  pBt = pPa
8980: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
8990: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
89a0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
89b0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67  KEY) ){.    pPag
89c0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
89d0: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
89e0: 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b  a = pPage->leaf;
89f0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
8a00: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
8a10: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
8a20: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
8a30: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
8a40: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
8a50: 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
8a60: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
8a70: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
8a80: 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20  >hasData = 0;.  
8a90: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
8aa0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
8ab0: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
8ac0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
8ad0: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
8ae0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8af0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8b00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8b10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8b20: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
8b30: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
8b40: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
8b50: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
8b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
8b70: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
8b80: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
8b90: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
8ba0: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
8bb0: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
8bc0: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
8bd0: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
8be0: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
8bf0: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
8c00: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
8c10: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
8c20: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
8c30: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
8c40: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
8c50: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
8c60: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
8c70: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
8c80: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
8c90: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
8ca0: 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
8cb0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
8cc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8cd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8ce0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8d00: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
8d10: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
8d20: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
8d30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8d40: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
8d50: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
8d60: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
8d70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
8d80: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
8d90: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
8da0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
8db0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
8dc0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
8dd0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
8de0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
8df0: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
8e00: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
8e10: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
8e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8e30: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
8e40: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
8e50: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
8e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
8e70: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
8e80: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
8e90: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
8ea0: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
8eb0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
8ec0: 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a 65    u16 usableSize
8ed0: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
8ee0: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
8ef0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
8f00: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
8f10: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
8f20: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
8f30: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
8f40: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8f50: 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20 20 20  u16 nFree;      
8f60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8f70: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
8f80: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
8f90: 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20 20 20  u16 top;        
8fa0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
8fb0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
8fc0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20  tent area */..  
8fd0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
8fe0: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
8ff0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
9000: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
9010: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  e->aData;.    if
9020: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
9030: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
9040: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
9050: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9060: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
9070: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
9080: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33  pBt->pageSize<=3
9090: 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67  2768 );.    pPag
90a0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
90b0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
90c0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
90d0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
90e0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
90f0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
9100: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9110: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
9120: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
9130: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
9140: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9150: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9160: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
9170: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9180: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
9190: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
91a0: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
91b0: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
91c0: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
91d0: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
91e0: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
91f0: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
9200: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9210: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
9220: 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
9230: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
9240: 69 67 68 74 20 63 61 75 73 65 20 75 73 65 20 74  ight cause use t
9250: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
9260: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
9270: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
9280: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
9290: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
92a0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
92b0: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
92c0: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
92d0: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
92e0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
92f0: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
9300: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
9310: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
9320: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
9330: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
9340: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
9350: 28 53 51 4c 49 54 45 5f 4f 56 45 52 52 45 41 44  (SQLITE_OVERREAD
9360: 5f 43 48 45 43 4b 29 20 7c 7c 20 31 0a 20 20 20  _CHECK) || 1.   
9370: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 65   {.      int iCe
9380: 6c 6c 46 69 72 73 74 3b 20 20 20 2f 2a 20 46 69  llFirst;   /* Fi
9390: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
93a0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ll index */.    
93b0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
93c0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
93d0: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
93e0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
93f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9400: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
9410: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
9420: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
9430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9440: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
9450: 0a 20 20 20 20 20 20 69 43 65 6c 6c 46 69 72 73  .      iCellFirs
9460: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
9470: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
9480: 0a 20 20 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  .      iCellLast
9490: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
94a0: 34 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  4;.      if( !pP
94b0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
94c0: 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
94d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
94e0: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
94f0: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
9500: 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  yte(&data[cellOf
9510: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
9520: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
9530: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
9540: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
9550: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9560: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9570: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9580: 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
9590: 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
95a0: 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c]);.        if(
95b0: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
95c0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
95d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
95e0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
95f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9600: 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20   }  .#endif..   
9610: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
9620: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
9630: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
9640: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
9650: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
9660: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
9670: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a  a[hdr+7] + top;.
9680: 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20      while( pc>0 
9690: 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78  ){.      u16 nex
96a0: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  t, size;.      i
96b0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
96c0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -4 ){.        /*
96d0: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
96e0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
96f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9700: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9710: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
9720: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
9730: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
9740: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
9750: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
9760: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
9770: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
9780: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
9790: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
97a0: 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e  must be in accen
97b0: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
97c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
97d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
97e0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
97f0: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
9800: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
9810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
9820: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
9830: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
9840: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
9850: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
9860: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
9870: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
9880: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
9890: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
98a0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
98b0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
98c0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
98d0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
98e0: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
98f0: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
9900: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
9910: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
9920: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
9930: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
9940: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
9950: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
9960: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
9970: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
9980: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
9990: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
99a0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
99b0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
99c0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
99d0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
99e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
99f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
9a00: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
9a10: 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2d  >nFree = nFree -
9a20: 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32   (cellOffset + 2
9a30: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pPage->nCell);.
9a40: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63  .#if 0.  /* Chec
9a50: 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f  k that all the o
9a60: 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63 65  ffsets in the ce
9a70: 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20  ll offset array 
9a80: 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
9a90: 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d  . .  ** .  ** Om
9aa0: 69 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73  itting this cons
9ab0: 69 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e  istency check an
9ac0: 64 20 75 73 69 6e 67 20 74 68 65 20 70 50 61 67  d using the pPag
9ad0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b  e->maskPage mask
9ae0: 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  .  ** to prevent
9af0: 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65   overrunning the
9b00: 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e 20   page buffer in 
9b10: 66 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c  findCell() resul
9b20: 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35  ts in a.  ** 2.5
9b30: 25 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61  % performance ga
9b40: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20  in..  */.  {.   
9b50: 20 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20   u8 *pOff;      
9b60: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73    /* Iterator us
9b70: 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20  ed to check all 
9b80: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65  cell offsets are
9b90: 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20   in range */.   
9ba0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
9bb0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9bc0: 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73  end of cell offs
9bd0: 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  et array */.    
9be0: 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  u8 mask;        
9bf0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
9c00: 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65   that must be ze
9c10: 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c  ro in MSB of cel
9c20: 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20  l offsets */.   
9c30: 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28   mask = ~(((u8)(
9c40: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
9c50: 29 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20  ))-1);.    pEnd 
9c60: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
9c70: 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c  et + pPage->nCel
9c80: 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f  l*2];.    for(pO
9c90: 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  ff=&data[cellOff
9ca0: 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64  set]; pOff!=pEnd
9cb0: 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61   && !((*pOff)&ma
9cc0: 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20  sk); pOff+=2);. 
9cd0: 20 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e     if( pOff!=pEn
9ce0: 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
9cf0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9d00: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
9d10: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61  .#endif..    pPa
9d20: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
9d30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9d40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9d50: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
9d60: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
9d70: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
9d80: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
9d90: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
9da0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
9db0: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
9dc0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
9dd0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
9de0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
9df0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
9e00: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
9e10: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
9e20: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
9e30: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
9e40: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
9e50: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
9e60: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
9e70: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
9e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9e90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
9ea0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
9eb0: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
9ec0: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
9ed0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
9ee0: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
9ef0: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
9f00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9f10: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
9f20: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
9f30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9f40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9f50: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
9f60: 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61    /*memset(&data
9f70: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
9f80: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
9f90: 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20  ;*/.  data[hdr] 
9fa0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
9fb0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
9fc0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
9fd0: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
9fe0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
9ff0: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
a000: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
a010: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a020: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
a030: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
a040: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42  Page->nFree = pB
a050: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
a060: 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46  first;.  decodeF
a070: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
a080: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
a090: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
a0a0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
a0b0: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
a0c0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
a0d0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
a0e0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
a0f0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
a100: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61  <=32768 );.  pPa
a110: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
a120: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
a130: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
a140: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
a150: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
a160: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
a170: 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
a180: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
a190: 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
a1a0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
a1b0: 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
a1c0: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
a1d0: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
a1e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
a1f0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
a200: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
a210: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
a220: 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
a230: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
a240: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
a250: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
a260: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
a270: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
a280: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
a290: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
a2a0: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
a2b0: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
a2c0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
a2d0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
a2e0: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
a2f0: 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
a300: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
a310: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
a320: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
a330: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
a340: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
a350: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
a360: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eded..**.** If t
a370: 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
a380: 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
a390: 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
a3a0: 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
a3b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
a3c0: 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
a3d0: 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
a3e0: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
a3f0: 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
a400: 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
a410: 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
a420: 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
a430: 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
a440: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
a450: 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
a460: 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
a470: 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
a480: 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
a490: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
a4a0: 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
a4b0: 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
a4c0: 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
a4d0: 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
a4e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a4f0: 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  BtreeGetPage(.  
a500: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
a510: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
a520: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
a530: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
a540: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
a550: 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
a560: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
a570: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
a580: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
a590: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
a5a0: 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
a5b0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f      /* Do not lo
a5c0: 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
a5d0: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
a5e0: 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
a5f0: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
a600: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a610: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
a620: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
a630: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
a640: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
a650: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
a660: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
a670: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
a680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
a690: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
a6a0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
a6b0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
a6c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a6d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
a6e0: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
a6f0: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
a700: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
a710: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
a720: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
a730: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
a740: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
a750: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
a760: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
a770: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
a780: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
a790: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
a7a0: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
a7b0: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
a7c0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
a7d0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
a7e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a7f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
a800: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
a810: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
a820: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
a830: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
a840: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
a850: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
a860: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
a870: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
a880: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
a890: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
a8a0: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
a8b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a8c0: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
a8d0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
a8e0: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
a8f0: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
a900: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
a910: 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61  tic Pgno pagerPa
a920: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
a930: 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50   *pBt){.  int nP
a940: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  age = -1;.  int 
a950: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rc;.  assert( pB
a960: 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72  t->pPage1 );.  r
a970: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
a980: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
a990: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
a9a0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
a9b0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65  LITE_OK || nPage
a9c0: 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  ==-1 );.  return
a9d0: 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a   (Pgno)nPage;.}.
a9e0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
a9f0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
aa00: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
aa10: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
aa20: 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63  e.** is just a c
aa30: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
aa40: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
aa50: 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  te calls to.** s
aa60: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
aa70: 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ge() and sqlite3
aa80: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  BtreeInitPage().
aa90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
aaa0: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
aab0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
aac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
aad0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
aae0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
aaf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ab00: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
ab10: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
ab20: 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f  e **ppPage     /
ab30: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
ab40: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
ab50: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
ab60: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
ab70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ab80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ab90: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
aba0: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
abb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
abc0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
abd0: 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f   }..  /* It is o
abe0: 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74 68  ften the case th
abf0: 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20 77  at the page we w
ac00: 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  ant is already i
ac10: 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66  n cache..  ** If
ac20: 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65   so, get it dire
ac30: 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65  ctly.  This save
ac40: 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67  s us from having
ac50: 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61   to call.  ** pa
ac60: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74  gerPagecount() t
ac70: 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f  o make sure pgno
ac80: 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74   is within limit
ac90: 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74 73  s, which results
aca0: 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75  .  ** in a measu
acb0: 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e  reable performan
acc0: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e  ce improvements.
acd0: 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 20  .  */.  *ppPage 
ace0: 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  = pPage = btreeP
acf0: 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 70  ageLookup(pBt, p
ad00: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
ad10: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65  e ){.    /* Page
ad20: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63   is already in c
ad30: 61 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ache */.    rc =
ad40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
ad50: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65  lse{.    /* Page
ad60: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20   not in cache.  
ad70: 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20  Acquire it. */. 
ad80: 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65     if( pgno>page
ad90: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
ada0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
adb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
adc0: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
add0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
ade0: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
adf0: 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
ae00: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
ae10: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
ae20: 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d  e = *ppPage;.  }
ae30: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
ae40: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20  sInit ){.    rc 
ae50: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
ae60: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
ae70: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
ae80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
ae90: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
aea0: 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  ;.    *ppPage = 
aeb0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
aec0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
aed0: 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
aee0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
aef0: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
af00: 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
af10: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
af20: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
af30: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
af40: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
af50: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
af60: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
af70: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
af80: 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ow==0 || sqlite3
af90: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
afa0: 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  t(pPage->pDbPage
afb0: 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  )>1 );.    asser
afc0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
afd0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
afe0: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
aff0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b000: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
b010: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
b020: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
b030: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
b040: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
b050: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b060: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
b070: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
b080: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b090: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b0a0: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
b0b0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
b0c0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
b0d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
b0e0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
b0f0: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
b100: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
b110: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
b120: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
b130: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
b140: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
b150: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
b160: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
b170: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
b180: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
b190: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
b1a0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
b1b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
b1c0: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
b1d0: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
b1e0: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
b1f0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
b200: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
b210: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
b220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b230: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
b240: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
b250: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
b260: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
b270: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
b280: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
b290: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b2a0: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
b2b0: 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
b2c0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
b2d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
b2e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b300: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
b310: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
b320: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
b330: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
b340: 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
b350: 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
b360: 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
b370: 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
b380: 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
b390: 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
b3a0: 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
b3b0: 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
b3c0: 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
b3d0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
b3e0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
b3f0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
b400: 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  ) will likely re
b410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b420: 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75  UPT..      ** Bu
b430: 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e  t no harm is don
b440: 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20  e by this.  And 
b450: 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72  it is very impor
b460: 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20  tant that.      
b470: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  ** sqlite3BtreeI
b480: 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
b490: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
b4a0: 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
b4b0: 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
b4c0: 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
b4d0: 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
b4e0: 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
b4f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
b500: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
b510: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
b520: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
b530: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
b540: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
b550: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
b560: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
b570: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
b580: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b590: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
b5a0: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
b5b0: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
b5c0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b5d0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
b5e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
b5f0: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
b600: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
b610: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
b620: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
b630: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
b640: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
b650: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
b660: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
b670: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
b680: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61  ame is NULL.** a
b690: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69   new database wi
b6a0: 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65  th a random name
b6b0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
b6c0: 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65  is randomly name
b6d0: 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  d.** database fi
b6e0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
b6f0: 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ed when sqlite3B
b700: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
b710: 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69  alled..** If zFi
b720: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
b730: 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
b740: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
b750: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
b760: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
b770: 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
b780: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
b790: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
b7a0: 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
b7b0: 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
b7c0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
b7d0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
b7e0: 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
b7f0: 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
b800: 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
b810: 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
b820: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b830: 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
b840: 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
b850: 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
b860: 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
b870: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
b880: 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
b890: 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
b8a0: 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
b8b0: 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
b8c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
b8d0: 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  reeOpen(.  const
b8e0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
b8f0: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
b900: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
b910: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
b920: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
b930: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
b940: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
b950: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
b960: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
b970: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
b980: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
b990: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
b9a0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
b9b0: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
b9c0: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
b9d0: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
b9e0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
b9f0: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
ba00: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
ba10: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
ba20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
ba30: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
ba40: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
ba50: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
ba60: 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  tree */.  BtShar
ba70: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
ba80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
ba90: 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
baa0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
bab0: 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bad0: 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
bae0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
baf0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
bb00: 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
bb10: 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
bb20: 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
bb30: 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
bb40: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
bb50: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
bb60: 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
bb70: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
bb80: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
bba0: 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
bbb0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
bbc0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
bbd0: 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
bbe0: 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
bbf0: 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
bc00: 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  */..  /* Set the
bc10: 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
bc20: 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
bc30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
bc40: 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
bc50: 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
bc60: 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20 54  ased database. T
bc70: 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e  his symbol is on
bc80: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a 20  ly required if. 
bc90: 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68   ** either of th
bca0: 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72  e shared-data or
bcb0: 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74   autovacuum feat
bcc0: 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65  ures are compile
bcd0: 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  d .  ** into the
bce0: 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23   library..  */.#
bcf0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
bd00: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
bd10: 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65  ACHE) || !define
bd20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
bd30: 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64  TOVACUUM).  #ifd
bd40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
bd50: 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73  EMORYDB.    cons
bd60: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
bd70: 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63  0;.  #else.    c
bd80: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
bd90: 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20   = zFilename && 
bda0: 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d  !strcmp(zFilenam
bdb0: 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a  e, ":memory:");.
bdc0: 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a    #endif.#endif.
bdd0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
bde0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
bdf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
be00: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
be10: 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66    pVfs = db->pVf
be20: 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  s;.  p = sqlite3
be30: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
be40: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
be50: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
be60: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
be70: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
be80: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
be90: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69   p->db = db;..#i
bea0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
beb0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
bec0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
bed0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
bee0: 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
bef0: 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
bf00: 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
bf10: 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
bf20: 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
bf30: 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
bf40: 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
bf50: 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
bf60: 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  h.  */.  if( isM
bf70: 65 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65  emdb==0 && zFile
bf80: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
bf90: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20  e[0] ){.    if( 
bfa0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
bfb0: 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45  fig.sharedCacheE
bfc0: 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  nabled ){.      
bfd0: 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
bfe0: 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
bff0: 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
c000: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
c010: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
c020: 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  c(nFullPathname)
c030: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
c040: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
c050: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  ed;.      p->sha
c060: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
c070: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
c080: 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63 68 65  LITE_SharedCache
c090: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
c0a0: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
c0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c0c0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
c0d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
c0e0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
c0f0: 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50    sqlite3OsFullP
c100: 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
c110: 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61  ilename, nFullPa
c120: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
c130: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75  hname);.      mu
c140: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
c150: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
c160: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
c170: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
c180: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
c190: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
c1a0: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
c1b0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
c1c0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
c1d0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
c1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
c1f0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
c200: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f  hared);.      fo
c210: 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
c220: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
c230: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
c240: 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
c250: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
c260: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
c270: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
c280: 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
c290: 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
c2a0: 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
c2b0: 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20  Bt->pPager)).   
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
c2d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
c2e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
c2f0: 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
c300: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
c310: 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e      for(iDb=db->
c320: 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69  nDb-1; iDb>=0; i
c330: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20  Db--){.         
c340: 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74     Btree *pExist
c350: 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ing = db->aDb[iD
c360: 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20  b].pBt;.        
c370: 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e      if( pExistin
c380: 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e  g && pExisting->
c390: 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  pBt==pBt ){.    
c3a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c3b0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
c3c0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
c3d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c3e0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
c3f0: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
c400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c410: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
c420: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
c430: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c440: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
c450: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c460: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
c470: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c480: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
c490: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
c4a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
c4b0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
c4c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
c4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
c4e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
c4f0: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
c500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c510: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
c520: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
c530: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
c540: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
c550: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
c560: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
c570: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
c580: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
c590: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
c5a0: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
c5b0: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
c5c0: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
c5d0: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
c5e0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
c5f0: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
c600: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
c610: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
c620: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
c630: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
c640: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c650: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
c660: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c670: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
c680: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
c690: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
c6a0: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
c6b0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
c6c0: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
c6d0: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
c6e0: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
c6f0: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
c700: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
c710: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
c720: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
c730: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
c740: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
c750: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
c760: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
c770: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
c780: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
c790: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
c7a0: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
c7b0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
c7c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
c7d0: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
c7e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
c7f0: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
c800: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
c810: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
c820: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
c830: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
c840: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
c850: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
c860: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c870: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
c880: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
c890: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
c8a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
c8b0: 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
c8c0: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
c8d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
c8f0: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
c900: 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  fsFlags);.    if
c910: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c920: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
c930: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
c940: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
c950: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
c960: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
c970: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
c980: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c990: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
c9a0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
c9b0: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d   }.    pBt->db =
c9c0: 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
c9d0: 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
c9e0: 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
c9f0: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
ca00: 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
ca10: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
ca20: 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50  .  .    sqlite3P
ca30: 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
ca40: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
ca50: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42  eReinit);.    pB
ca60: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
ca70: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
ca80: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65  = 0;.    pBt->re
ca90: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
caa0: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
cab0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
cac0: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
cad0: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
cae0: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20  eader[16]);.    
caf0: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
cb00: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
cb10: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
cb20: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
cb30: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
cb40: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
cb50: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
cb60: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
cb70: 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
cb80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
cb90: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
cba0: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
cbb0: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
cbc0: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
cbd0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
cbe0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
cbf0: 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
cc00: 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
cc10: 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
cc20: 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
cc30: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
cc40: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
cc50: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
cc60: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
cc70: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
cc80: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
cc90: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
cca0: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
ccb0: 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
ccc0: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
ccd0: 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
cce0: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
ccf0: 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
cd00: 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
cd10: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
cd20: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
cd30: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
cd40: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
cd50: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
cd60: 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
cd70: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
cd80: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
cd90: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
cda0: 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
cdb0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
cdc0: 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
cdd0: 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
cde0: 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  e{.      nReserv
cdf0: 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
ce00: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
ce10: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
ce20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ce30: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ce40: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
ce50: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
ce60: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
ce70: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
ce80: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
ce90: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
cea0: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
ceb0: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
cec0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  if.    }.    rc 
ced0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
cee0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
cef0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
cf00: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
cf10: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
cf20: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
cf30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
cf40: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
cf50: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
cf60: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
cf70: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
cf80: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
cf90: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
cfa0: 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
cfb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cfc0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
cfd0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
cfe0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
cff0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
d000: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
d010: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
d020: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
d030: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
d040: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
d050: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
d060: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
d070: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
d080: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
d090: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
d0a0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
d0b0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
d0c0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
d0d0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
d0e0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
d0f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
d100: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
d110: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
d120: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
d130: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
d140: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
d150: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
d160: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
d170: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d180: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
d190: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d1a0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
d1b0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
d1c0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
d1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d1e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d1f0: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
d200: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
d210: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
d220: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
d230: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
d240: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
d250: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
d260: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
d270: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
d280: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
d290: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
d2a0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
d2b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d2c0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
d2d0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
d2e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
d2f0: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
d300: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
d310: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
d320: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
d330: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
d340: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
d350: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
d360: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
d370: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
d380: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
d390: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
d3a0: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
d3b0: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
d3c0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
d3d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
d3e0: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
d3f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
d400: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d410: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
d420: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
d430: 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
d440: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
d450: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
d460: 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
d470: 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
d480: 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
d490: 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
d4a0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
d4b0: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
d4c0: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
d4d0: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
d4e0: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
d4f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d500: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
d510: 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
d520: 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
d530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d540: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
d550: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
d560: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
d570: 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
d580: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
d590: 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
d5a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
d5b0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
d5c0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
d5d0: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
d5e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
d5f0: 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
d600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d610: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d620: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
d630: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
d640: 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
d650: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d660: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
d670: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
d680: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
d690: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
d6a0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
d6b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
d6c0: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
d6d0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
d6e0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
d6f0: 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
d700: 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
d710: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d720: 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
d730: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
d740: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
d750: 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
d760: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d770: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
d780: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
d790: 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
d7a0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
d7b0: 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
d7c0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
d7d0: 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
d7e0: 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
d7f0: 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
d800: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
d810: 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
d820: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
d830: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
d840: 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
d850: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
d860: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
d870: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
d880: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d890: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
d8a0: 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  E.  sqlite3_mute
d8b0: 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74  x *pMaster;.  Bt
d8c0: 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
d8d0: 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
d8e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
d8f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
d900: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d910: 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71  ;.  pMaster = sq
d920: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
d930: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
d940: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
d950: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d960: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
d970: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
d980: 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
d990: 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
d9a0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
d9b0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
d9c0: 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
d9d0: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
d9e0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d9f0: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
da00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
da10: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
da20: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
da30: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
da40: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
da50: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
da60: 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
da70: 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
da80: 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
da90: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
daa0: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
dab0: 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
dac0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
dad0: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
dae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
daf0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
db00: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
db10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
db20: 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
db30: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
db40: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
db50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
db60: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
db70: 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
db80: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
db90: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
dba0: 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
dbb0: 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
dbc0: 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
dbd0: 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
dbe0: 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e  SIZE(pBt) bytes.
dbf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dc00: 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
dc10: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
dc20: 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
dc30: 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
dc40: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
dc50: 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
dc60: 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
dc70: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
dc80: 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
dc90: 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
dca0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
dcb0: 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
dcc0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
dcd0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
dce0: 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ee( pBt->pTmpSpa
dcf0: 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70  ce);.  pBt->pTmp
dd00: 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Space = 0;.}../*
dd10: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
dd20: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
dd30: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
dd40: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
dd50: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
dd60: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
dd70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
dd80: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
dd90: 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
dda0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
ddb0: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
ddc0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
ddd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
dde0: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
ddf0: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
de00: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
de10: 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
de20: 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
de30: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
de40: 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
de50: 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
de60: 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
de70: 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
de80: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
de90: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
dea0: 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
deb0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
dec0: 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
ded0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
dee0: 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
def0: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
df00: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
df10: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
df20: 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
df30: 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
df40: 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
df50: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
df60: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
df70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
df80: 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
df90: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
dfa0: 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
dfb0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
dfc0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
dfd0: 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
dfe0: 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
dff0: 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
e000: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
e010: 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
e020: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
e030: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
e040: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
e050: 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
e060: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
e070: 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
e080: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
e090: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
e0a0: 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
e0b0: 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
e0c0: 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
e0d0: 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
e0e0: 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
e0f0: 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
e100: 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
e110: 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
e120: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
e130: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
e140: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
e150: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
e160: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
e170: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
e180: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
e190: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
e1a0: 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
e1b0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
e1c0: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
e1d0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
e1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e1f0: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
e200: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
e210: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
e220: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
e230: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
e240: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e250: 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
e260: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
e270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
e280: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
e290: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
e2a0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
e2b0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
e2c0: 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
e2d0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
e2e0: 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
e2f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
e300: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e310: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
e320: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
e330: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
e340: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
e350: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
e360: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
e370: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
e380: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
e390: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
e3a0: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
e3b0: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
e3c0: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
e3d0: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
e3e0: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
e3f0: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
e400: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
e410: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
e420: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
e430: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
e440: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
e450: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
e460: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
e470: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
e480: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
e490: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
e4a0: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
e4b0: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
e4c0: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
e4d0: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
e4e0: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
e4f0: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
e500: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
e510: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
e520: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
e530: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
e540: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
e550: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
e560: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
e570: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
e580: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
e590: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
e5a0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
e5b0: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
e5c0: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
e5d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
e5e0: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
e5f0: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
e600: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
e610: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
e620: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e630: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
e640: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
e650: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e660: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
e670: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
e680: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
e690: 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
e6a0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
e6b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e6c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
e6d0: 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
e6e0: 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
e6f0: 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
e700: 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
e710: 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
e720: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
e730: 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
e740: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
e750: 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
e760: 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
e770: 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
e780: 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
e790: 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
e7a0: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
e7b0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
e7c0: 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
e7d0: 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
e7e0: 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
e7f0: 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
e800: 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
e810: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
e820: 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
e830: 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
e840: 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
e850: 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
e860: 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
e870: 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
e880: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
e890: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
e8a0: 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
e8b0: 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
e8c0: 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
e8d0: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
e8e0: 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
e8f0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
e900: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
e910: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e920: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
e930: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
e940: 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
e950: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
e960: 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
e970: 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
e980: 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
e990: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
e9a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e9b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
e9c0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
e9d0: 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
e9e0: 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
e9f0: 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
ea00: 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
ea10: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
ea20: 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
ea30: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
ea40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ea50: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
ea60: 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
ea70: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
ea80: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
ea90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
eaa0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
eab0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
eac0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
ead0: 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
eae0: 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
eaf0: 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
eb00: 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
eb10: 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
eb20: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
eb30: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
eb40: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
eb50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
eb60: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
eb70: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
eb80: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
eb90: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
eba0: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
ebb0: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
ebc0: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
ebd0: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
ebe0: 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
ebf0: 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
ec00: 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
ec10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
ec20: 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
ec30: 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
ec40: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
ec50: 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
ec60: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
ec70: 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
ec80: 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
ec90: 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
eca0: 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
ecb0: 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
ecc0: 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
ecd0: 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
ece0: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
ecf0: 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
ed00: 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
ed10: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
ed20: 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
ed30: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
ed40: 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
ed50: 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
ed60: 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
ed70: 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
ed80: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
ed90: 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
eda0: 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
edb0: 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
edc0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
edd0: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
ede0: 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
edf0: 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
ee00: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
ee10: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
ee20: 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
ee30: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
ee40: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
ee50: 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
ee60: 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46  en the pageSizeF
ee70: 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ixed flag is set
ee80: 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
ee90: 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
eea0: 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
eeb0: 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
eec0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
eed0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
eee0: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
eef0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
ef00: 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
ef10: 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
ef20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ef30: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
ef40: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
ef50: 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
ef60: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
ef70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
ef80: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
ef90: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
efa0: 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
efb0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
efc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
efd0: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
efe0: 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
eff0: 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
f000: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
f010: 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
f020: 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
f030: 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
f040: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
f050: 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
f060: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
f070: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
f080: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
f090: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
f0a0: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
f0b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
f0c0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
f0d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
f0e0: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
f0f0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
f100: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f110: 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
f120: 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
f130: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72  pace(pBt);.    r
f140: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f150: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
f160: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
f170: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
f180: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
f190: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
f1a0: 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
f1b0: 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
f1c0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
f1d0: 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
f1e0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
f1f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f200: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
f210: 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
f220: 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
f230: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
f240: 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
f250: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
f260: 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
f270: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f280: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
f290: 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
f2a0: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
f2b0: 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
f2c0: 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
f2d0: 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
f2e0: 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
f2f0: 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
f300: 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
f310: 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
f320: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f330: 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
f340: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
f350: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
f360: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
f370: 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
f380: 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
f390: 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
f3a0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
f3b0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
f3c0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
f3d0: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
f3e0: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
f3f0: 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
f400: 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
f410: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
f420: 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
f430: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
f440: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
f450: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
f460: 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
f470: 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
f480: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
f490: 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
f4a0: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
f4b0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
f4c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
f4d0: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
f4e0: 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
f4f0: 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
f500: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
f510: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
f520: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
f530: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  n;.}.#endif /* !
f540: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f550: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
f560: 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
f570: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
f580: 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
f590: 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
f5a0: 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
f5b0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
f5c0: 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
f5d0: 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
f5e0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
f5f0: 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
f600: 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
f610: 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
f620: 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
f630: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
f640: 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
f650: 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
f660: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
f670: 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
f680: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
f690: 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
f6a0: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
f6b0: 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
f6c0: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
f6d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
f6e0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
f6f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
f700: 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
f710: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f720: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
f730: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f740: 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
f750: 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
f760: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
f770: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
f780: 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28 61  eSizeFixed && (a
f790: 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
f7a0: 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
f7b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
f7c0: 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
f7d0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
f7e0: 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
f7f0: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
f800: 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
f810: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
f820: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f830: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
f840: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f850: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
f860: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
f870: 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
f880: 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
f890: 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
f8a0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
f8b0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
f8c0: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
f8d0: 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
f8e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f8f0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
f900: 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
f910: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
f920: 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
f930: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
f940: 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
f950: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
f960: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
f970: 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
f980: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
f990: 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
f9a0: 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
f9b0: 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
f9c0: 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
f9d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
f9e0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
f9f0: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
fa00: 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
fa10: 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
fa20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
fa30: 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
fa40: 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
fa50: 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
fa60: 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
fa70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
fa80: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
fa90: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
faa0: 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
fab0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
fac0: 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
fad0: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
fae0: 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
faf0: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
fb00: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
fb10: 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
fb20: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
fb30: 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
fb40: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
fb50: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
fb60: 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
fb70: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
fb80: 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
fb90: 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50  pPage1;.  int nP
fba0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
fbb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
fbc0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
fbd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
fbe0: 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
fbf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
fc00: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
fc10: 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
fc20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fc30: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
fc40: 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
fc50: 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
fc60: 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
fc70: 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
fc80: 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
fc90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
fca0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
fcb0: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
fcc0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
fcd0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
fce0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fcf0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
fd00: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73  t_failed;.  }els
fd10: 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b  e if( nPage>0 ){
fd20: 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a  .    int pageSiz
fd30: 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  e;.    int usabl
fd40: 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
fd50: 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
fd60: 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
fd70: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
fd80: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
fd90: 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
fda0: 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
fdb0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
fdc0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
fdd0: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
fde0: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
fdf0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
fe00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
fe10: 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
fe20: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
fe30: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
fe40: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
fe50: 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
fe60: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
fe70: 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
fe80: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
fe90: 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
fea0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
feb0: 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
fec0: 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
fed0: 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
fee0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
fef0: 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
ff00: 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
ff10: 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
ff20: 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
ff30: 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
ff40: 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
ff50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ff60: 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
ff70: 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
ff80: 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
ff90: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
ffa0: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
ffb0: 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65     pageSize = ge
ffc0: 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36  t2byte(&page1[16
ffd0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  ]);.    if( ((pa
ffe0: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
fff0: 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69  ze)!=0 || pageSi
10000 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20  ze<512 ||.      
10010 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41    (SQLITE_MAX_PA
10020 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26  GE_SIZE<32768 &&
10030 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
10040 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a  _MAX_PAGE_SIZE).
10050 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
10060 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
10070 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
10080 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
10090 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
100a0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
100b0 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
100c0 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  ];.    if( pageS
100d0 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
100e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
100f0 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
10100 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
10110 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
10120 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
10130 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
10140 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
10150 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
10160 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
10170 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
10180 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
10190 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
101a0 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
101b0 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
101c0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
101d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
101e0 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
101f0 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
10200 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
10210 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
10220 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
10230 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10240 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
10250 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
10260 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31  usableSize = (u1
10270 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  6)usableSize;.  
10280 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
10290 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
102a0 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
102b0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
102c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
102d0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
102e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
102f0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
10300 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
10310 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
10320 6c 65 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72  led;.      retur
10330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
10340 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c   }.    if( usabl
10350 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20  eSize<500 ){.   
10360 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
10370 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
10380 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
10390 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
103a0 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
103b0 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
103c0 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
103d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
103e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
103f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
10400 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
10410 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
10420 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
10430 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
10440 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
10450 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
10460 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
10470 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
10480 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
10490 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
104a0 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
104b0 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
104c0 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
104d0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
104e0 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
104f0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
10500 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
10510 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
10520 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
10530 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
10540 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
10550 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
10560 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
10570 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
10580 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
10590 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
105a0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
105b0 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
105c0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
105d0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
105e0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
105f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
10600 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
10610 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
10620 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c  a 2-byte poiner,
10630 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
10640 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
10650 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
10660 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
10670 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
10680 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
10690 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
106a0 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
106b0 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
106c0 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
106d0 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
106e0 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 23;.  pBt->mi
106f0 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  nLocal = (pBt->u
10700 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
10710 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
10720 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
10730 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
10740 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
10750 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
10760 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
10770 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70   23;.  assert( p
10780 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
10790 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
107a0 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
107b0 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
107c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
107d0 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
107e0 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
107f0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
10800 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
10810 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
10820 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
10830 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
10840 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63   lockBtree() exc
10850 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f  ept that it also
10860 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
10870 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
10880 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63   there is lock c
10890 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ontention..*/.st
108a0 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
108b0 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65  eeWithRetry(Btre
108c0 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20  e *pRef){.  int 
108d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
108e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
108f0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
10900 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28  x(pRef) );.  if(
10910 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
10920 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
10930 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
10940 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
10950 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
10960 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
10970 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
10980 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
10990 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
109a0 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
109b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
109c0 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
109d0 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
109e0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
109f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10a10 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
10a20 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
10a30 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
10a40 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
10a50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
10a60 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
10a70 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
10a80 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
10a90 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
10aa0 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
10ab0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
10ac0 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
10ad0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
10ae0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
10af0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
10b00 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
10b10 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
10b20 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
10b30 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
10b40 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
10b50 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
10b60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10b70 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
10b80 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
10b90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10ba0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
10bb0 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
10bc0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
10bd0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10be0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10bf0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
10c00 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
10c10 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10c20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10c30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10c40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
10c50 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
10c60 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
10c70 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  && pBt->pCursor=
10c80 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  =0 && pBt->pPage
10c90 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  1!=0 ){.    if( 
10ca0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
10cb0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
10cc0 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73  )>=1 ){.      as
10cd0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
10ce0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
10cf0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
10d00 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
10d10 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  }.    pBt->pPage
10d20 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1 = 0;.  }.}../*
10d30 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
10d40 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
10d50 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
10d60 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
10d70 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
10d80 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
10d90 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
10da0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10db0 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
10dc0 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
10dd0 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  rc;.  int nPage;
10de0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10df0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10e00 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10e10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10e20 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
10e30 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
10e40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10e50 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20  E_OK || nPage>0 
10e60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10e70 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
10e80 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
10e90 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
10ea0 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
10eb0 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
10ec0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
10ed0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
10ee0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
10ef0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
10f00 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
10f10 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
10f20 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
10f30 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
10f40 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75  der)==16 );.  pu
10f50 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d  t2byte(&data[16]
10f60 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
10f70 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
10f80 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
10f90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
10fa0 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
10fb0 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
10fc0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
10fd0 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
10fe0 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
10ff0 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
11000 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
11010 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
11020 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
11030 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
11040 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
11050 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
11060 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
11070 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
11080 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
11090 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
110a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
110b0 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
110c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
110d0 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
110e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
110f0 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
11100 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
11110 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
11120 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
11130 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
11140 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
11150 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
11160 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
11170 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
11180 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
11190 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
111a0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
111b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
111c0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
111d0 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
111e0 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
111f0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
11200 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
11210 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11220 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
11230 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
11240 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
11250 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
11260 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
11270 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
11280 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
11290 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
112a0 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
112b0 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
112c0 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
112d0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
112e0 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
112f0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
11300 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
11310 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
11320 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
11330 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
11340 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
11350 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
11360 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
11370 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
11380 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
11390 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
113a0 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
113b0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
113c0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
113d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
113e0 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
113f0 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
11400 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
11410 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
11420 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
11430 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
11440 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
11450 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
11460 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
11470 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
11480 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
11490 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
114a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
114b0 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
114c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
114d0 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
114e0 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
114f0 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
11500 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
11510 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
11520 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
11530 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
11540 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
11550 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
11560 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
11570 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
11580 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
11590 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
115a0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
115b0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
115c0 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
115d0 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
115e0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
115f0 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
11600 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
11610 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
11620 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
11630 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
11640 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
11650 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
11660 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
11670 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
11680 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
11690 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
116a0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
116b0 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
116c0 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
116d0 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
116e0 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
116f0 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
11700 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
11710 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
11720 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
11730 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
11740 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
11750 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
11760 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
11770 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
11780 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
11790 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
117a0 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
117b0 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
117c0 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
117d0 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
117e0 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
117f0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
11800 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
11810 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
11820 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
11830 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
11840 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
11850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11860 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
11870 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
11880 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  flag){.  sqlite3
11890 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
118a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
118b0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
118c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
118d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
118e0 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
118f0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
11900 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
11910 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
11920 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
11930 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
11940 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
11950 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
11960 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
11970 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
11980 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
11990 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
119a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
119b0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
119c0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
119d0 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
119e0 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
119f0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
11a00 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
11a10 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
11a20 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
11a30 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
11a40 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
11a50 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
11a60 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
11a70 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11a80 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
11a90 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
11aa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11ab0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
11ac0 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
11ad0 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
11ae0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
11af0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
11b00 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
11b10 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
11b20 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
11b30 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
11b40 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
11b50 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
11b60 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
11b70 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
11b80 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
11b90 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
11ba0 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69  WRITE) || pBt->i
11bb0 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20  sPending ){.    
11bc0 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
11bd0 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
11be0 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
11bf0 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
11c00 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
11c10 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
11c20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
11c30 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
11c40 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
11c50 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
11c60 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
11c70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
11c80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11c90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11ca0 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
11cb0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
11cc0 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
11cd0 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
11ce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
11cf0 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
11d00 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
11d10 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
11d20 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ..  do {.    /* 
11d30 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
11d40 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
11d50 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
11d60 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
11d70 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
11d80 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
11d90 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
11da0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
11db0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
11dc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
11dd0 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
11de0 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
11df0 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
11e00 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
11e10 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
11e20 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
11e30 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
11e40 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
11e50 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
11e60 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
11e70 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
11e80 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
11e90 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
11ea0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
11eb0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
11ec0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
11ed0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
11ee0 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
11ef0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
11f00 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
11f10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11f20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
11f30 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
11f40 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
11f50 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
11f60 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
11f70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11f80 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
11f90 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
11fa0 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
11fb0 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
11fc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
11fd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11fe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
11ff0 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
12000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12010 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
12020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12030 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
12040 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
12050 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
12060 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
12070 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
12080 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
12090 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
120a0 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
120b0 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
120c0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
120d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
120e0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
120f0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
12100 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
12110 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on++;.    }.    
12120 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
12130 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
12140 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
12150 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12160 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
12170 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
12180 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
12190 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
121a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
121b0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
121c0 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
121d0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  lag ){.      ass
121e0 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
121f0 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
12200 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
12210 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
12220 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c  sive = (u8)(wrfl
12230 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ag>1);.    }.#en
12240 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f  dif.  }...trans_
12250 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
12260 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
12270 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
12280 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
12290 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
122a0 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
122b0 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
122c0 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
122d0 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
122e0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
122f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
12300 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
12310 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
12320 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
12330 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
12340 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
12350 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
12360 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
12370 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
12380 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
12390 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
123a0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
123b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
123c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
123d0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
123e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
123f0 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
12400 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
12410 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
12420 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
12430 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
12440 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
12450 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
12460 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
12470 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
12480 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
12490 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
124a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
124b0 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
124c0 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
124d0 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
124e0 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12510 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
12520 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12550 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
12560 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
12570 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
125a0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
125b0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
125c0 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
125d0 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
125e0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
125f0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
12600 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12610 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12620 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12630 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12640 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
12650 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
12660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12670 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
12680 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
12690 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
126a0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
126b0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
126c0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
126d0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
126e0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20  ge, i);..    rc 
126f0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
12700 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
12710 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12730 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
12740 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
12750 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
12760 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
12770 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
12780 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
12790 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  l);.      rc = p
127a0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
127b0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
127c0 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
127d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
127e0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
127f0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
12800 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
12810 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
12820 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
12830 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
12840 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12850 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12860 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
12870 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
12880 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
12890 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
128a0 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
128b0 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
128c0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
128d0 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
128e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
128f0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
12900 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
12910 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  anteed to be a b
12920 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
12930 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
12940 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
12950 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
12960 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
12970 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
12980 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
12990 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
129a0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
129b0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
129c0 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
129d0 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
129e0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
129f0 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
12a00 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
12a10 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
12a20 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
12a50 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
12a60 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
12a70 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
12a80 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
12a90 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
12aa0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
12ab0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
12ac0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
12ad0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
12ae0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
12af0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
12b00 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
12b10 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
12b20 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
12b30 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
12b40 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
12b50 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
12b60 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
12b70 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
12b80 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
12b90 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
12ba0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
12bb0 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
12bc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12bd0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
12be0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12bf0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12c00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
12c10 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
12c20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
12c30 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
12c40 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
12c50 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
12c60 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
12c70 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
12c80 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
12c90 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
12ca0 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
12cb0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
12cc0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12cd0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
12ce0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
12cf0 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
12d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
12d10 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
12d20 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
12d30 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
12d40 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Cell;..    sqlit
12d50 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
12d60 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c  pPage);.    nCel
12d70 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
12d80 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
12d90 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
12da0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
12db0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
12dc0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
12dd0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
12de0 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
12df0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12e00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12e10 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
12e20 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
12e30 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
12e40 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
12e50 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
12e60 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
12e70 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
12e80 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
12e90 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
12ea0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
12eb0 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
12ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
12ed0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
12ee0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12f00 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
12f10 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
12f20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
12f30 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
12f40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12f60 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
12f70 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
12f80 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
12f90 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
12fa0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
12fb0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12fc0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12fd0 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
12fe0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12ff0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13000 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
13010 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
13020 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
13030 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
13040 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
13050 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
13060 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
13070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13080 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
13090 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
130a0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
130b0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
130c0 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
130d0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
130e0 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
130f0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
13100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
13110 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
13120 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
13130 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
13140 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
13150 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
13160 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
13170 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
13180 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
13190 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
131a0 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
131b0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
131c0 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
131d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
131e0 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
131f0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
13200 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
13210 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
13220 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
13230 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
13240 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
13250 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  ommit.){.  MemPa
13260 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
13270 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
13280 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
13290 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
132a0 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
132b0 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
132c0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
132d0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
132e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
132f0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
13300 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
13310 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
13320 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
13330 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
13340 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
13350 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
13360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13370 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13380 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
13390 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
133a0 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
133b0 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
133c0 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
133d0 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
133e0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
133f0 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
13400 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
13410 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
13420 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
13430 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
13440 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
13450 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
13460 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
13470 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
13480 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
13490 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
134a0 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
134b0 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
134c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
134d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
134e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
134f0 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
13500 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
13510 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
13520 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
13530 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
13540 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
13550 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
13560 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
13570 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
13580 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
13590 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
135a0 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
135b0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
135c0 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
135d0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
135e0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
135f0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
13600 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
13610 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
13620 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
13630 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
13640 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
13650 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
13660 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
13670 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
13680 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
13690 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
136a0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
136b0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
136c0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
136d0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
136e0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
136f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
13700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13720 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
13730 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
13740 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
13750 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
13760 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
13770 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
13780 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
13790 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
137a0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
137b0 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
137c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
137d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
137e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
137f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13800 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
13810 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
13820 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
13830 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
13840 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
13850 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
13860 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
13870 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
13880 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
13890 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
138a0 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
138b0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
138c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
138d0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
138e0 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
138f0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
13900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13910 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
13920 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
13930 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
13940 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
13950 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
13960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13970 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13980 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
13990 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
139a0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
139b0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
139c0 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
139d0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
139e0 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
139f0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
13a00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13a10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13a20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
13a30 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
13a40 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
13a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13a60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
13a70 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
13a80 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
13a90 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
13aa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
13ab0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
13ac0 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
13ad0 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
13ae0 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
13af0 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
13b00 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
13b10 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
13b20 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
13b30 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
13b40 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
13b50 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
13b60 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
13b70 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
13b80 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
13b90 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
13ba0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
13bb0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
13bc0 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
13bd0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
13be0 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
13bf0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
13c00 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
13c10 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
13c20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
13c30 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
13c40 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
13c50 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
13c60 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
13c70 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
13c80 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
13c90 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
13ca0 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
13cb0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
13cc0 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
13cd0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
13ce0 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
13cf0 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
13d00 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
13d10 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
13d20 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
13d30 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
13d40 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
13d50 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74   complete..*/.st
13d60 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
13d70 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
13d80 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
13d90 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b  , Pgno iLastPg){
13da0 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
13db0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
13dc0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
13dd0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
13de0 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
13df0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13e00 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
13e10 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
13e20 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
13e30 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
13e40 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
13e50 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
13e60 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
13e70 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69  GE(pBt) ){.    i
13e80 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54  nt rc;.    u8 eT
13e90 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
13ea0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
13eb0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
13ec0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
13ed0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
13ee0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
13ef0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13f00 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
13f10 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
13f20 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
13f30 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
13f40 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
13f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13f60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13f70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
13f80 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
13f90 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
13fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13fb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
13fc0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
13fd0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
13fe0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
13ff0 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
14000 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
14010 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
14020 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
14030 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
14040 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
14050 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d   if nFin is non-
14060 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
14070 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
14080 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
14090 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
140a0 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
140b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
140c0 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
140d0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
140e0 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
140f0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
14100 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
14110 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14120 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
14130 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
14140 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
14150 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
14160 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
14170 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
14180 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a  g, iLastPg, 1);.
14190 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
141a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
141b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
141c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
141d0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
141e0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
141f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
14200 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
14210 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
14220 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
14230 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
14240 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
14250 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
14260 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
14270 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
14280 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63  astPg;..      rc
14290 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
142a0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
142b0 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
142c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
142d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
142e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
142f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14300 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
14310 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
14320 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
14330 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
14340 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
14350 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
14360 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
14370 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
14380 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
14390 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
143a0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
143b0 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
143c0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
143d0 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
143e0 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
143f0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
14400 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
14410 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
14420 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
14430 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
14440 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
14450 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
14460 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
14470 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
14480 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
14490 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
144a0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
144b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
144c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
144d0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
144e0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
144f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14500 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
14510 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
14520 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
14530 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
14540 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
14550 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
14560 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
14570 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
14580 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
14590 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
145a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
145b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
145c0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
145d0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
145e0 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
145f0 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
14600 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20  nFin!=0);.      
14610 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
14620 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
14630 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14650 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14660 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
14670 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
14680 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
14690 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50     while( iLastP
146a0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
146b0 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
146c0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
146d0 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20  astPg) ){.      
146e0 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
146f0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
14700 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
14710 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20  ge *pPg;.       
14720 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
14730 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
14740 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67  t, iLastPg, &pPg
14750 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
14760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
14780 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14790 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
147a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
147b0 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
147c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
147d0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
147e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
147f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
14800 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14810 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14820 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
14830 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14840 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
14850 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
14860 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20  iLastPg);.  }.  
14870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
14890 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
148a0 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
148b0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
148c0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
148d0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
148e0 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
148f0 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
14900 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
14910 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
14920 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
14930 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
14940 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
14950 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
14960 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
14970 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
14980 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
14990 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
149a0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
149b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
149c0 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
149d0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
149e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
149f0 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
14a00 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
14a10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14a20 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
14a30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14a40 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
14a50 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14a60 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
14a70 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
14a80 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
14a90 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
14aa0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
14ab0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
14ac0 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
14ad0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
14ae0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
14af0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
14b00 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50  p(pBt, 0, pagerP
14b10 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
14b20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
14b30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14b40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14b50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14b60 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
14b70 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
14b80 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
14b90 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
14ba0 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
14bb0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
14bc0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
14bd0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14be0 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
14bf0 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
14c00 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
14c10 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14c20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
14c30 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
14c40 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
14c50 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
14c60 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
14c70 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
14c80 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
14c90 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
14ca0 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
14cb0 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
14cc0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
14cd0 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
14ce0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
14cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
14d00 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
14d10 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
14d20 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
14d30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
14d40 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
14d50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14d60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14d70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14d80 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
14d90 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
14da0 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
14db0 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
14dc0 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
14dd0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
14de0 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  nFin;.    Pgno n
14df0 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  Free;.    Pgno n
14e00 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f  Ptrmap;.    Pgno
14e10 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73   iFree;.    cons
14e20 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74  t int pgsz = pBt
14e30 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
14e40 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67  Pgno nOrig = pag
14e50 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
14e60 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  ;..    if( PTRMA
14e70 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
14e80 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
14e90 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
14ea0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
14eb0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
14ec0 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
14ed0 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
14ee0 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
14ef0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
14f00 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
14f10 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
14f20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
14f30 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
14f40 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
14f50 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
14f60 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
14f70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
14f80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14f90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
14fa0 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
14fb0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
14fc0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
14fd0 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
14fe0 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
14ff0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
15000 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73  ig)+pgsz/5)/(pgs
15010 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  z/5);.    nFin =
15020 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
15030 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
15040 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
15050 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
15060 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
15070 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
15080 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
15090 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
150a0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
150b0 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
150c0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
150d0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
150e0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
150f0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
15100 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
15110 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
15120 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
15130 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
15140 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
15150 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
15160 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
15170 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
15180 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
15190 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
151a0 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
151b0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
151c0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
151d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
151e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
151f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
15200 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
15210 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
15220 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
15230 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
15240 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
15250 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
15260 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
15270 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
15280 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
15290 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
152a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
152b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
152c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
152d0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
152e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
152f0 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
15300 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
15310 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
15320 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
15330 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53  ndif /* ifndef S
15340 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
15350 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
15360 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
15370 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
15380 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
15390 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
153a0 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
153b0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
153c0 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
153d0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
153e0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
153f0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
15400 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
15410 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
15420 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
15430 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
15440 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
15450 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
15460 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
15470 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
15480 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
15490 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
154a0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
154b0 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
154c0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
154d0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
154e0 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
154f0 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
15500 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
15510 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
15520 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
15530 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
15540 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
15550 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
15560 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
15570 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
15580 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
15590 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
155a0 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
155b0 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
155c0 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
155d0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
155e0 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
155f0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
15600 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
15610 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
15620 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
15630 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
15640 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
15650 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
15660 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
15670 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
15680 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
15690 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
156a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
156b0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
156c0 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
156d0 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
156e0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
156f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
15700 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
15710 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
15720 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
15730 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
15740 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
15750 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
15760 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
15770 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
15780 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
15790 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
157a0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
157b0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
157c0 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
157d0 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
157e0 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
157f0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
15800 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
15810 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
15820 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
15830 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
15840 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
15850 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
15860 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
15870 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
15880 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
15890 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
158a0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
158b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
158c0 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
158d0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
158e0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
158f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15900 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
15910 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
15920 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
15930 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15940 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15950 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
15960 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
15970 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
15980 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
15990 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
159a0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
159b0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
159c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
159d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
159e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
159f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15a00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
15a10 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
15a20 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
15a30 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
15a40 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
15a50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
15a60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
15a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15a80 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
15a90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
15aa0 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
15ab0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
15ac0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
15ad0 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
15ae0 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
15af0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
15b00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15b10 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
15b20 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
15b30 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
15b40 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
15b50 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
15b60 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
15b70 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
15b80 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
15b90 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
15ba0 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
15bb0 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
15bc0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
15bd0 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
15be0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
15bf0 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
15c00 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
15c10 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
15c20 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
15c30 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
15c40 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
15c50 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
15c60 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
15c70 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
15c80 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
15c90 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
15ca0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
15cb0 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
15cc0 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ks..**.** This w
15cd0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
15ce0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
15cf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15d00 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
15d10 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
15d20 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
15d30 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
15d40 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
15d50 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
15d60 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29  aseTwo(Btree *p)
15d70 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
15d80 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
15d90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15da0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
15db0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
15dc0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
15dd0 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
15de0 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
15df0 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
15e00 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
15e10 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
15e20 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
15e30 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
15e40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
15e50 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
15e60 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
15e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
15e80 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
15e90 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
15ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
15eb0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
15ec0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
15ed0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
15ee0 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
15ef0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
15f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15f10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15f20 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
15f30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15f40 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
15f50 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
15f60 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
15f70 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
15f80 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  s any kind of tr
15f90 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
15fa0 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72  decrement the tr
15fb0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
15fc0 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
15fd0 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
15fe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
15ff0 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  nt reaches 0, se
16000 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65  t.  ** the share
16010 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
16020 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
16030 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
16040 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a   call below.  **
16050 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
16060 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   pager..  */.  i
16070 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
16080 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
16090 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
160a0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
160b0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
160c0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
160d0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
160e0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
160f0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
16100 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
16110 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
16120 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
16130 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
16140 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
16150 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
16160 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
16170 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
16180 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
16190 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
161a0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 62 74 72 65  ion..  */.  btre
161b0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
161c0 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72  (pBt);.  p->inTr
161d0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
161e0 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
161f0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
16200 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
16210 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
16220 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16230 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16240 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
16250 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
16260 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
16270 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
16280 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16290 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
162a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
162b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
162c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
162d0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
162e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
162f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
16300 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
16310 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
16320 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16330 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16340 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
16350 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16360 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
16370 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
16380 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
16390 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
163a0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
163b0 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
163c0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
163d0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
163e0 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
163f0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
16400 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
16410 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
16420 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
16430 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
16440 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
16450 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
16460 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
16470 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
16480 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
16490 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
164a0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
164b0 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
164c0 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
164d0 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
164e0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
164f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
16500 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
16510 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
16520 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
16530 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
16540 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
16550 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
16560 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
16570 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
16580 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
16590 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
165a0 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
165b0 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
165c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
165d0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
165e0 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
165f0 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
16600 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
16610 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
16620 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
16630 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
16640 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
16650 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
16660 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
16670 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
16680 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
16690 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
166a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
166b0 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
166c0 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
166d0 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
166e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
166f0 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
16700 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
16710 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
16720 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
16730 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
16740 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
16750 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
16760 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
16770 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
16780 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
16790 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
167a0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
167b0 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
167c0 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
167d0 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
167e0 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
167f0 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
16800 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
16810 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
16820 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
16830 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16840 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
16850 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
16860 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
16870 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
16880 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16890 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
168a0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
168b0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
168c0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
168d0 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
168e0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
168f0 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
16900 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
16910 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
16920 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
16930 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
16940 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
16950 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
16960 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
16970 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
16980 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
16990 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
169a0 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
169b0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
169c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
169d0 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
169e0 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
169f0 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
16a00 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
16a10 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
16a20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
16a30 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
16a40 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16a50 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
16a60 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
16a70 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
16a80 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
16a90 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
16aa0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16ab0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
16ac0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
16ad0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
16ae0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
16af0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
16b00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16b10 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
16b20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
16b30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16b40 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
16b50 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
16b60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16b70 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65  (p);.  rc = save
16b80 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
16b90 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
16ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16bb0 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
16bc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16bd0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
16be0 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
16bf0 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
16c00 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
16c10 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  rred whilst.    
16c20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
16c30 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
16c40 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
16c50 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
16c60 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
16c70 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
16c80 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
16c90 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
16ca0 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
16cb0 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
16cc0 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
16cd0 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
16ce0 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
16cf0 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
16d00 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
16d10 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
16d20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
16d30 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
16d40 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
16d50 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
16d60 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
16d70 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
16d80 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
16d90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
16da0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
16db0 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a  Cursors(p, rc);.
16dc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
16dd0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
16de0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
16df0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
16e00 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
16e10 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
16e20 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
16e30 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
16e40 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
16e50 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
16e60 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
16e70 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
16e80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
16e90 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
16ea0 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
16eb0 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
16ec0 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
16ed0 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
16ee0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c  .    ** call sql
16ef0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
16f00 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
16f10 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
16f20 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
16f30 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
16f40 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
16f50 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ( sqlite3BtreeGe
16f60 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
16f70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
16f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
16f90 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
16fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
16fb0 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
16fc0 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
16fd0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
16fe0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
16ff0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66  _READ;.  }..  if
17000 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
17010 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
17020 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
17030 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
17040 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
17050 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
17060 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
17070 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
17080 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
17090 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
170a0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
170b0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
170c0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
170d0 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
170e0 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70  ontent(pBt);.  p
170f0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
17100 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b  S_NONE;.  unlock
17110 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
17120 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  t);..  btreeInte
17130 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
17140 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17150 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17160 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
17170 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
17180 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
17190 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
171a0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
171b0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
171c0 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
171d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
171e0 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
171f0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
17200 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
17210 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
17220 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
17230 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
17240 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
17250 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
17260 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
17270 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
17280 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
17290 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
172a0 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
172b0 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
172c0 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
172d0 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
172e0 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
172f0 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
17300 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
17310 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
17320 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
17330 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
17340 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
17350 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
17360 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
17370 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
17380 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
17390 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
173a0 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
173b0 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
173c0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
173d0 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
173e0 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
173f0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
17400 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
17410 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
17420 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
17430 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
17440 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
17450 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
17460 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
17470 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
17480 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
17490 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
174a0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
174b0 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
174c0 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
174d0 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
174e0 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
174f0 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
17500 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
17510 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
17520 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
17530 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
17540 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
17550 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
17560 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
17570 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
17580 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
17590 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
175a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
175b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
175c0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
175d0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
175e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65   assert( pBt->re
175f0 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
17600 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
17610 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
17620 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
17630 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
17640 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
17650 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
17660 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61  RITE || pBt->rea
17670 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63  dOnly) ){.    rc
17680 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
17690 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AL;.  }else{.   
176a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
176b0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
176c0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
176d0 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
176e0 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
176f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
17700 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
17710 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64  th.    ** an ind
17720 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
17730 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
17740 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
17750 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53  y using.    ** S
17760 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
17770 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
17780 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
17790 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
177a0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
177b0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
177c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
177d0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
177e0 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f  s active..    */
177f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17800 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
17810 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
17820 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
17830 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
17840 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17850 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17860 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
17870 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
17880 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
17890 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
178a0 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
178b0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
178c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
178d0 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
178e0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
178f0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
17900 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
17910 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
17920 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
17930 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
17940 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
17950 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
17960 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
17970 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
17980 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
17990 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
179a0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
179b0 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
179c0 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
179d0 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
179e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
179f0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
17a00 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
17a10 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
17a20 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
17a30 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
17a40 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
17a50 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
17a60 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
17a70 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
17a80 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
17a90 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
17aa0 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
17ab0 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
17ac0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
17ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17ae0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
17af0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
17b00 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
17b10 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
17b30 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
17b40 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
17b50 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
17b60 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
17b70 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
17b80 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
17b90 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
17ba0 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
17bb0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17bc0 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
17bd0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
17be0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
17bf0 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
17c00 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
17c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17c20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
17c30 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
17c40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17c50 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
17c60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17c70 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
17c80 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
17c90 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
17ca0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
17cb0 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
17cc0 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
17cd0 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
17ce0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
17cf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17d00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
17d10 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
17d20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
17d30 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
17d40 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
17d50 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
17d60 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
17d70 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
17d80 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
17d90 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
17da0 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
17db0 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
17dc0 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
17dd0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
17de0 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
17df0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
17e00 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
17e10 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
17e20 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
17e30 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
17e40 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
17e50 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
17e60 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17e70 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
17e80 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
17e90 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
17ea0 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
17eb0 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
17ec0 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
17ed0 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
17ee0 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
17ef0 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
17f00 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
17f10 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
17f20 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
17f30 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
17f40 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
17f50 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
17f60 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
17f70 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
17f80 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17f90 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
17fa0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
17fb0 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
17fc0 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
17fd0 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
17fe0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
17ff0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
18000 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
18010 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
18020 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
18030 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
18040 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
18050 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
18060 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
18070 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
18080 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
18090 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
180a0 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
180b0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
180c0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
180d0 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65  ursorSize() byte
180e0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  s of memory .** 
180f0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43  pointed to by pC
18100 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72  ur have been zer
18110 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  oed by the calle
18120 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
18130 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
18140 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18160 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
18170 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
18180 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
181b0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
181c0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
181f0 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
18200 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
18210 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
18220 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
18230 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
18240 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
18250 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
18260 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18280 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
18290 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
182a0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
182b0 6e 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  nPage;.  BtShare
182c0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
182d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
182e0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
182f0 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
18300 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
18310 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  wrFlag==1 );.  i
18320 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
18330 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
18340 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 69  eadOnly );.    i
18350 66 28 20 4e 45 56 45 52 28 70 42 74 2d 3e 72 65  f( NEVER(pBt->re
18360 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
18370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
18380 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
18390 20 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72     rc = checkFor
183a0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
183b0 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a   iTable, 0, 0);.
183c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
183d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
183e0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
183f0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
18400 41 43 48 45 20 29 3b 0a 20 20 20 20 20 20 72 65  ACHE );.      re
18410 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18420 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
18430 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
18440 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
18450 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
18460 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18470 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
18480 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
18490 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
184a0 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
184b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
184c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
184d0 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 20  t->pPager, (int 
184e0 2a 29 26 6e 50 61 67 65 29 3b 20 0a 20 20 69 66  *)&nPage); .  if
184f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18500 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
18510 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
18520 6c 65 3d 3d 31 20 26 26 20 6e 50 61 67 65 3d 3d  le==1 && nPage==
18530 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
18540 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
18550 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
18560 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
18570 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
18580 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
18590 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
185a0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
185b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
185c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
185d0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
185e0 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
185f0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
18600 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
18610 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
18620 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
18630 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
18640 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
18650 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
18660 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
18670 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
18680 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
18690 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
186a0 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
186b0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
186c0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
186d0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
186e0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
186f0 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
18700 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
18710 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
18720 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
18730 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
18740 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
18750 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
18760 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
18770 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
18780 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
18790 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
187a0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
187b0 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
187c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61  SQLITE_OK;..crea
187d0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
187e0 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  ion:.  releasePa
187f0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
18800 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  0]);.  unlockBtr
18810 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
18820 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18830 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18840 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
18850 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18870 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
18880 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
18890 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
188c0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
188d0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
188e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
18910 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
18920 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
18930 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18950 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
18960 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
18970 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
189a0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
189b0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
189c0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
189d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
189e0 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
189f0 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
18a00 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
18a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18a20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18a30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18a40 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
18a50 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
18a60 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
18a70 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
18a80 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
18a90 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
18aa0 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
18ab0 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
18ac0 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
18ad0 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
18ae0 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
18af0 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
18b00 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
18b10 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
18b20 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
18b30 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
18b40 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
18b50 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
18b60 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18b70 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
18b80 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43  eturn sizeof(BtC
18b90 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ursor);.}../*.**
18ba0 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
18bb0 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
18bc0 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
18bd0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
18be0 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
18bf0 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
18c00 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
18c10 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
18c20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
18c30 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
18c40 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
18c50 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
18c60 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
18c70 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
18c80 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
18c90 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
18ca0 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
18cb0 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
18cc0 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
18cd0 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
18ce0 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
18cf0 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
18d00 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
18d10 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
18d20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
18d30 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
18d40 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
18d50 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
18d60 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
18d70 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
18d80 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
18d90 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
18da0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
18db0 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
18dc0 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
18dd0 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
18de0 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
18df0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
18e00 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
18e10 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
18e20 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
18e30 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
18e40 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
18e50 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
18e60 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
18e70 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
18e80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
18e90 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
18ea0 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
18eb0 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
18ec0 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
18ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18ee0 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
18ef0 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
18f00 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
18f10 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
18f20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
18f30 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
18f40 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
18f50 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
18f60 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
18f70 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
18f80 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
18f90 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
18fa0 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
18fb0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
18fc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
18fd0 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
18fe0 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
18ff0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
19000 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
19010 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
19020 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
19030 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
19040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19050 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
19060 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
19070 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
19080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19090 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
190a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
190b0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
190c0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
190d0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
190e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
190f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19100 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
19110 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19120 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
19130 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
19140 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
19150 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
19160 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
19170 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
19180 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
19190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
191a0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
191b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
191c0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
191d0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
191e0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
191f0 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
19200 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
19210 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
19220 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
19230 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
19240 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
19250 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
19260 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
19270 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
19280 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
19290 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
192a0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
192b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
192c0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
192d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
192e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
192f0 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
19300 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
19310 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
19320 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
19330 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
19340 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
19350 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
19360 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
19370 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
19380 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
19390 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
193a0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70   BtCursor *pTemp
193b0 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
193c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
193d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
193e0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d  );.  memcpy(pTem
193f0 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65  pCur, pCur, size
19400 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20  of(BtCursor));. 
19410 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74   pTempCur->pNext
19420 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72   = 0;.  pTempCur
19430 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66  ->pPrev = 0;.  f
19440 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70  or(i=0; i<=pTemp
19450 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
19460 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
19470 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
19480 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61  apPage[i]->pDbPa
19490 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
194a0 74 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65  t( pTempCur->pKe
194b0 79 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  y==0 );.}../*.**
194c0 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72   Delete a tempor
194d0 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20  ary cursor such 
194e0 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74  as was made by t
194f0 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61  he CreateTempora
19500 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75  ryCursor().** fu
19510 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f  nction above..*/
19520 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
19530 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
19540 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
19550 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
19560 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19570 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19580 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
19590 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
195a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
195b0 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 61  gerUnref(pCur->a
195c0 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
195d0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
195e0 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
195f0 79 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  y);.}..../*.** M
19600 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
19610 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
19620 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
19630 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
19640 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
19650 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
19660 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
19670 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65  , call.** sqlite
19680 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
19690 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
196a0 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
196b0 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
196c0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
196d0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
196e0 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
196f0 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
19700 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
19710 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  f calls to sqlit
19720 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
19730 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
19740 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
19750 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
19760 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
19770 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
19780 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
19790 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
197a0 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
197b0 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
197c0 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
197d0 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
197e0 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
197f0 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
19800 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
19810 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
19820 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
19830 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
19840 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
19850 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
19860 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
19870 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
19880 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
19890 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
198a0 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
198b0 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
198c0 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
198d0 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
198e0 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
198f0 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
19900 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
19910 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
19920 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
19930 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
19940 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
19950 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
19960 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
19970 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
19980 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
19990 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
199a0 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
199b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
199c0 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
199d0 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
199e0 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
199f0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
19a00 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
19a10 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
19a20 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
19a30 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
19a40 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
19a50 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
19a60 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
19a70 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
19a80 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
19a90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19aa0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
19ab0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
19ac0 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
19ad0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
19ae0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19af0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
19b00 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
19b10 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
19b20 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
19b30 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
19b40 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  NKey = 1;.    }e
19b50 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
19b60 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
19b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
19b80 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
19b90 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
19ba0 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
19bb0 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
19bc0 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
19bd0 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
19be0 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
19bf0 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c30 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
19c40 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
19c90 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33     \.    sqlite3
19ce0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
19cf0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
19d00 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
19d10 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
19d20 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
19d30 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
19dd0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
19de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
19e20 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
19e30 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
19e40 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
19e50 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
19e60 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
19e70 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
19e80 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
19e90 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
19ea0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
19eb0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
19ec0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
19ed0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
19ee0 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
19ef0 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
19f00 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
19f10 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
19f20 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
19f30 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
19f40 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19f50 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
19f60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19f70 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
19f80 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
19f90 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
19fa0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19fb0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19fc0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
19fd0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
19fe0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
19ff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a000 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a010 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a020 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
1a030 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a040 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
1a050 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a060 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1a070 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
1a080 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1a090 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
1a0a0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1a0b0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1a0c0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
1a0d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a0e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1a0f0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
1a100 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
1a110 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1a120 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1a130 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1a140 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
1a150 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
1a160 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1a170 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
1a180 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
1a190 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
1a1a0 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
1a1b0 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
1a1c0 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
1a1d0 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
1a1e0 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
1a1f0 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
1a200 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
1a210 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1a220 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1a230 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1a240 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1a250 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1a260 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1a270 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1a280 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1a290 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1a2a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1a2b0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1a2c0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1a2d0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1a2e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1a2f0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1a300 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a310 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
1a320 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
1a330 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
1a340 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
1a350 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
1a360 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
1a370 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
1a380 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1a390 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
1a3a0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
1a3b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a3c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
1a3d0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
1a3e0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
1a3f0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1a400 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
1a410 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
1a420 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
1a430 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1a440 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
1a450 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
1a460 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
1a470 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
1a480 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
1a490 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
1a4a0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
1a4b0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
1a4c0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
1a4d0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
1a4e0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
1a4f0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1a500 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
1a510 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a520 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1a530 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
1a540 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1a550 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
1a560 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
1a570 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
1a580 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
1a590 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
1a5a0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1a5b0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1a5c0 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1a5d0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1a5e0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1a5f0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1a600 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1a610 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1a620 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1a630 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1a640 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1a650 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1a660 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1a670 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1a680 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1a690 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1a6a0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1a6b0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1a6c0 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1a6d0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1a6e0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1a6f0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1a700 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1a710 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1a720 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1a730 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1a740 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1a750 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1a760 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1a770 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1a780 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1a790 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1a7a0 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f  ed *pBt, .  Pgno
1a7b0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1a7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72           /* Over
1a7d0 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d  flow page */.  M
1a7e0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a800 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
1a810 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
1a820 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
1a830 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
1a840 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
1a850 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1a860 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
1a870 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
1a880 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1a890 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a8a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1a8b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1a8c0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1a8d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
1a8e0 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
1a8f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a900 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
1a910 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
1a920 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1a930 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
1a940 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
1a950 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
1a960 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
1a970 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
1a980 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
1a990 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
1a9a0 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
1a9b0 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
1a9c0 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
1a9d0 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
1a9e0 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
1a9f0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
1aa00 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
1aa10 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
1aa20 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
1aa30 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
1aa40 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1aa50 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1aa60 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
1aa70 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
1aa80 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
1aa90 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
1aaa0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1aab0 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
1aac0 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
1aad0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1aae0 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
1aaf0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
1ab00 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63  uess<=pagerPagec
1ab10 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
1ab20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1ab30 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
1ab40 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
1ab50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ab60 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
1ab70 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1ab80 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
1ab90 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
1aba0 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
1abb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1abc0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1abd0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1abe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1abf0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1ac00 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1ac10 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1ac20 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1ac30 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1ac40 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
1ac50 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
1ac60 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1ac70 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1ac80 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1ac90 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1aca0 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1acb0 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1acc0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1acd0 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1ace0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1acf0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1ad00 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1ad10 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1ad20 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1ad30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1ad40 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1ad50 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1ad60 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1ad70 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1ad80 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1ad90 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1ada0 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1adb0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1adc0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1add0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1ade0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1adf0 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1ae00 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1ae10 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1ae20 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1ae30 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1ae40 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1ae50 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1ae60 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1ae70 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1ae80 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1ae90 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1aea0 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1aeb0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1aec0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1aed0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1aee0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1aef0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1af00 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1af10 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1af20 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1af30 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1af40 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1af50 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1af60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1af70 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1af80 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1afa0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1afb0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1afc0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1afd0 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1afe0 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1aff0 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1b000 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1b010 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1b020 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1b030 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1b040 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1b050 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1b060 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1b070 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1b080 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1b090 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1b0a0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1b0b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1b0c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b0d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b0e0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b0f0 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1b100 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1b110 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1b120 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1b130 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1b140 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1b150 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1b160 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1b170 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1b180 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1b190 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b1a0 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1b1b0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1b1c0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1b1d0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1b1e0 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1b1f0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1b200 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1b210 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1b220 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1b230 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1b240 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1b250 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1b260 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1b270 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1b280 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1b290 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1b2a0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1b2b0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1b2c0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1b2d0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1b2e0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1b2f0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1b300 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1b310 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b320 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
1b330 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
1b340 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
1b350 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
1b360 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
1b370 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
1b380 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
1b390 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
1b3a0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1b3b0 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
1b3c0 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1b3d0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
1b3e0 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
1b3f0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1b400 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1b410 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1b420 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1b430 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1b440 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1b450 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1b460 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1b470 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1b480 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1b490 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1b4a0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1b4b0 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1b4c0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1b4d0 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1b4e0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1b4f0 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1b500 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1b510 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1b520 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1b530 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1b540 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1b550 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1b560 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1b570 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1b580 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1b590 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1b5a0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1b5b0 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1b5c0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1b5d0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1b5e0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1b5f0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1b600 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1b610 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1b620 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1b630 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1b640 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1b650 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1b660 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1b670 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1b680 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1b690 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1b6a0 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1b6b0 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1b6c0 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1b6d0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1b6e0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1b6f0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1b700 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1b710 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1b720 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1b730 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1b740 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1b750 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1b760 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1b770 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1b780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b790 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1b7a0 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1b7b0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1b7c0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1b7d0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1b7e0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
1b7f0 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
1b800 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
1b810 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1b820 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1b830 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1b840 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1b850 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1b860 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1b870 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1b880 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1b890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1b8a0 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1b8b0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1b8c0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1b8d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b8e0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1b8f0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1b900 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1b910 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1b920 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1b930 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1b940 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1b950 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1b960 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1b970 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b980 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b990 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1b9a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b9b0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1b9c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1b9d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1b9e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1b9f0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1ba00 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1ba10 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1ba20 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1ba30 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1ba40 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1ba50 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1ba60 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1ba70 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1ba80 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
1ba90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
1baa0 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
1bab0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a  ur->info.nData .
1bac0 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
1bad0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1bae0 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
1baf0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
1bb00 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
1bb10 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
1bb20 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
1bb30 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
1bb40 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
1bb50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bb60 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1bb70 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1bb80 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
1bb90 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
1bba0 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
1bbb0 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
1bbc0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
1bbd0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1bbe0 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
1bbf0 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
1bc00 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
1bc10 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
1bc20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1bc30 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
1bc40 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
1bc50 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1bc60 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
1bc70 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
1bc80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
1bc90 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1bca0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
1bcb0 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
1bcc0 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
1bcd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1bce0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1bcf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1bd00 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
1bd10 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
1bd20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1bd30 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
1bd40 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
1bd50 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
1bd60 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
1bd70 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
1bd80 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
1bd90 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1bda0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1bdb0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1bdc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1bdd0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1bde0 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
1bdf0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
1be00 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
1be10 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1be20 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
1be30 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
1be40 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
1be50 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
1be60 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
1be70 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
1be80 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1be90 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
1bea0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
1beb0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1bec0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
1bed0 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
1bee0 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
1bef0 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
1bf00 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
1bf10 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
1bf20 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
1bf30 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
1bf40 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
1bf50 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1bf60 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1bf70 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1bf80 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
1bf90 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
1bfa0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
1bfb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1bfc0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
1bfd0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
1bfe0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
1bff0 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
1c000 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
1c010 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
1c020 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
1c030 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1c040 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1c050 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1c060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c070 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
1c080 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1c090 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1c0a0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1c0b0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
1c0c0 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
1c0d0 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
1c0e0 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
1c0f0 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
1c100 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
1c110 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1c120 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1c130 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
1c140 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
1c150 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
1c160 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
1c170 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1c180 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1c190 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
1c1a0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
1c1b0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
1c1c0 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
1c1d0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1c1e0 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
1c1f0 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
1c200 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c210 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1c220 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
1c230 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
1c240 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1c250 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
1c260 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1c270 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1c280 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
1c290 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1c2a0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
1c2b0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
1c2c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
1c2d0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1c2e0 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
1c2f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1c300 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
1c310 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
1c320 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
1c330 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
1c340 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
1c350 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
1c360 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1c370 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
1c380 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1c390 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
1c3a0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
1c3b0 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
1c3c0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
1c3d0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
1c3e0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
1c3f0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
1c400 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
1c410 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
1c420 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
1c430 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
1c440 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
1c450 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1c460 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1c470 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
1c480 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1c490 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1c4a0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
1c4b0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1c4c0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1c4d0 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
1c4e0 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
1c4f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c500 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1c510 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
1c520 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
1c530 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
1c540 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1c550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1c560 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
1c570 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
1c580 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
1c590 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
1c5a0 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
1c5b0 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
1c5c0 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
1c5d0 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
1c5e0 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
1c5f0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
1c600 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
1c610 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1c620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c630 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
1c640 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
1c650 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
1c660 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c680 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
1c690 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1c6a0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
1c6b0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1c6c0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
1c6d0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
1c6e0 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
1c6f0 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
1c700 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
1c710 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
1c720 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c730 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
1c740 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1c750 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
1c760 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
1c770 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1c780 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c790 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1c7a0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1c7b0 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
1c7c0 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
1c7d0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
1c7e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c7f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1c800 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1c810 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1c820 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c830 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1c840 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c850 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1c860 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
1c870 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1c880 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1c890 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1c8a0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1c8b0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1c8c0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1c8d0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1c8e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1c8f0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1c900 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1c910 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1c920 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1c930 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1c940 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1c950 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1c960 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1c970 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1c980 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1c990 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
1c9a0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1c9b0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1c9c0 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1c9d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1c9e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1c9f0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1ca00 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1ca10 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1ca20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ca30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ca40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ca50 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1ca60 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1ca70 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1ca80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1ca90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1caa0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1cab0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
1cac0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1cad0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1cae0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1caf0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1cb00 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1cb10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1cb20 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1cb30 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1cb40 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1cb50 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1cb60 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20  *)pBuf, 0, 0);. 
1cb70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cb80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1cb90 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1cba0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1cbb0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1cbc0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1cbd0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1cbe0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1cbf0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1cc00 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1cc10 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1cc20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1cc30 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1cc40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1cc50 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1cc60 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1cc70 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1cc80 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1cc90 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1cca0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1ccb0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1ccc0 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1ccd0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1cce0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1ccf0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1cd00 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1cd10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1cd20 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1cd30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1cd40 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1cd50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cd60 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1cd70 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1cd80 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1cd90 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1cda0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1cdb0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1cdc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cdd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1cde0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1cdf0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1ce00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1ce10 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1ce20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ce30 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1ce40 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1ce50 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1ce60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ce70 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1ce80 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1ce90 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1cea0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1ceb0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
1cec0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ced0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1cee0 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1cef0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1cf00 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1cf10 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1cf20 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1cf30 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1cf40 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1cf50 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1cf60 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1cf70 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1cf80 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1cf90 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1cfa0 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1cfb0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1cfc0 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1cfd0 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1cfe0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1cff0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1d000 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1d010 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1d020 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1d030 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1d040 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1d050 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1d060 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1d070 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1d080 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1d090 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1d0a0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1d0b0 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1d0c0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1d0d0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1d0e0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1d0f0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1d100 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1d110 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1d120 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1d130 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1d140 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1d150 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1d160 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1d170 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1d180 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1d190 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1d1a0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1d1b0 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1d1c0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1d1d0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1d1e0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1d1f0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
1d200 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
1d210 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
1d220 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1d230 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
1d240 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
1d250 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
1d260 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
1d270 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1d280 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
1d290 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
1d2a0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1d2b0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1d2c0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1d2d0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1d2e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1d2f0 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
1d300 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
1d310 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1d320 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
1d330 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
1d340 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
1d350 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
1d360 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1d370 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1d380 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1d390 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1d3a0 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
1d3b0 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
1d3c0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
1d3d0 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
1d3e0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1d3f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1d400 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1d410 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d420 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1d430 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d440 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
1d450 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1d460 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1d470 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1d480 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1d490 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1d4a0 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
1d4b0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1d4c0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1d4d0 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
1d4e0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
1d4f0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
1d500 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1d510 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
1d520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
1d530 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
1d540 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1d550 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1d560 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1d570 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1d580 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1d590 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1d5a0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1d5b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1d5c0 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1d5d0 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1d5e0 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1d5f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1d600 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1d610 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1d620 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1d630 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1d640 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1d650 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1d660 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1d670 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1d680 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1d690 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1d6a0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1d6b0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1d6c0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1d6d0 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1d6e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1d6f0 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1d700 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1d710 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1d720 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1d730 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1d740 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1d750 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
1d760 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
1d770 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
1d780 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
1d790 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
1d7a0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
1d7b0 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
1d7c0 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
1d7d0 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
1d7e0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1d7f0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1d800 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
1d810 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
1d820 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
1d830 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1d840 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
1d850 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
1d860 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
1d870 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
1d880 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
1d890 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1d8a0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
1d8b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1d8c0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1d8d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
1d8e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1d8f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1d900 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1d910 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d920 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1d930 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
1d940 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1d950 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
1d960 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73  return 0;.}.cons
1d970 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1d980 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
1d990 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1d9a0 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
1d9b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d9c0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1d9d0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1d9e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1d9f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1da00 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
1da10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1da20 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1da30 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1da40 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1da50 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
1da60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1da70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
1da80 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1da90 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
1daa0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
1dab0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1dac0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
1dad0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
1dae0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
1daf0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1db00 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
1db10 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
1db20 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
1db30 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
1db40 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
1db50 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
1db60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1db70 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
1db80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1db90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1dba0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1dbb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1dbc0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1dbd0 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
1dbe0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
1dbf0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
1dc00 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
1dc10 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
1dc20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dc30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1dc40 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
1dc50 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
1dc60 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
1dc70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1dc80 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
1dc90 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
1dca0 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
1dcb0 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
1dcc0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
1dcd0 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
1dce0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
1dcf0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1dd00 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
1dd10 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20  ->nCell<1 ){.   
1dd20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1dd30 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1dd40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1dd50 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
1dd60 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  NDEBUG./*.** Pag
1dd70 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
1dd80 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
1dd90 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
1dda0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
1ddb0 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
1ddc0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
1ddd0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
1dde0 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
1ddf0 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
1de00 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
1de10 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
1de20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
1de30 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
1de40 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
1de50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
1de60 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
1de70 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
1de80 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1de90 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
1dea0 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
1deb0 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
1dec0 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
1ded0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  {.  assert( iIdx
1dee0 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
1def0 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
1df00 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1df10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
1df20 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
1df30 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
1df40 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
1df50 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
1df60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
1df70 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1df80 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
1df90 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
1dfa0 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
1dfb0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
1dfc0 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
1dfd0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
1dfe0 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
1dff0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
1e000 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
1e010 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
1e020 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
1e030 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
1e040 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
1e050 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
1e060 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
1e070 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
1e080 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
1e090 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
1e0a0 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
1e0b0 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
1e0c0 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
1e0d0 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76  cell index..*/.v
1e0e0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1e0f0 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  MoveToParent(BtC
1e100 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1e110 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1e120 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1e130 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1e140 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1e150 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1e160 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1e170 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1e180 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e190 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
1e1a0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
1e1b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
1e1c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
1e1d0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
1e1e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
1e1f0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
1e200 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e210 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72  ]->pgno.  );.  r
1e220 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
1e230 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1e240 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
1e250 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
1e260 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1e270 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1e280 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 0;.}../*.** 
1e290 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1e2a0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
1e2b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1e2c0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
1e2d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
1e2e0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
1e2f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e300 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
1e310 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1e320 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e330 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
1e340 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1e350 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1e360 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
1e370 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
1e380 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1e390 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
1e3a0 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
1e3b0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1e3c0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1e3d0 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
1e3e0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1e3f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1e400 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
1e410 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
1e420 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1e430 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
1e440 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
1e450 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20  r->skip;.    }. 
1e460 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1e470 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
1e480 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
1e490 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
1e4a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1e4b0 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=1; i<=pCur->
1e4c0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1e4d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e4e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1e4f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1e500 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53      if( .      S
1e510 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
1e520 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
1e530 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
1e540 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
1e550 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20  e[0])).    ){.  
1e560 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1e570 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1e580 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
1e590 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
1e5a0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
1e5b0 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
1e5c0 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
1e5d0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1e5e0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
1e5f0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69   = 0;.  pCur->ai
1e600 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
1e610 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1e620 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
1e630 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
1e640 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
1e650 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
1e660 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
1e670 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1e680 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
1e690 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
1e6a0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
1e6b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e6c0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1e6d0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
1e6e0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
1e6f0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
1e700 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
1e710 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
1e720 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
1e730 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1e740 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
1e750 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
1e760 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
1e770 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
1e780 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1e790 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65  e = ((pRoot->nCe
1e7a0 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
1e7b0 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
1e7c0 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  D);.  }.  return
1e7d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
1e7e0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1e7f0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
1e800 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1e810 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
1e820 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
1e830 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1e840 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
1e850 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1e860 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1e870 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
1e880 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
1e890 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1e8a0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1e8b0 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
1e8c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e8d0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
1e8e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e8f0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
1e900 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1e910 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e920 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e930 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e940 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e950 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1e960 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1e970 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1e980 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e990 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
1e9a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1e9b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1e9c0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1e9d0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1e9e0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1e9f0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
1ea00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
1ea10 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1ea20 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1ea30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ea40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1ea50 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1ea60 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
1ea70 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1ea80 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
1ea90 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
1eaa0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1eab0 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
1eac0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
1ead0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
1eae0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
1eaf0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
1eb00 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1eb10 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
1eb20 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
1eb30 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
1eb40 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
1eb50 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
1eb60 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
1eb70 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1eb80 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
1eb90 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
1eba0 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
1ebb0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
1ebc0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
1ebd0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
1ebe0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1ebf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1ec00 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
1ec10 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1ec20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1ec30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ec40 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1ec50 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
1ec60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1ec70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1ec80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1ec90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1eca0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
1ecb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1ecc0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
1ecd0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1ece0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
1ecf0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1ed00 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ed10 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1ed20 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
1ed30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1ed40 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
1ed50 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1ed60 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
1ed70 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  o);.  }.  if( rc
1ed80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ed90 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1eda0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
1edb0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
1edc0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1edd0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
1ede0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1edf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ee00 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1ee10 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
1ee20 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
1ee30 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1ee40 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1ee50 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1ee60 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1ee70 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1ee80 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1ee90 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1eea0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1eeb0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1eec0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1eed0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
1eee0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1eef0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1ef00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1ef10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1ef20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1ef30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1ef40 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1ef50 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1ef60 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1ef70 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1ef80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ef90 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1efa0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1efb0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
1efc0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1efd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1efe0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1eff0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1f000 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1f010 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f020 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1f030 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f040 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
1f050 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1f060 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1f070 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1f080 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1f090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1f0a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1f0b0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1f0c0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1f0d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1f0e0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1f0f0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1f100 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1f110 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1f120 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1f130 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1f140 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1f150 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1f160 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1f170 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1f180 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1f190 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
1f1a0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f1b0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1f1c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f1d0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1f1e0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1f1f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
1f200 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
1f210 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
1f220 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
1f230 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
1f240 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
1f250 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1f260 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  && pCur->atLast 
1f270 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1f280 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
1f290 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
1f2a0 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
1f2b0 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
1f2c0 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
1f2d0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
1f2e0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
1f2f0 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
1f300 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
1f310 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
1f320 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
1f330 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f340 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
1f350 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
1f360 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
1f370 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1f380 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
1f390 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
1f3a0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1f3b0 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
1f3c0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1f3d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
1f3e0 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
1f3f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f400 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
1f410 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1f420 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1f430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1f440 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1f450 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1f460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1f470 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1f480 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
1f490 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1f4a0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1f4b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f4c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f4d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1f4e0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1f4f0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
1f500 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
1f510 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
1f520 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
1f530 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
1f540 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f550 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1f560 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
1f570 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
1f580 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
1f590 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
1f5a0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
1f5b0 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
1f5c0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
1f5d0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
1f5e0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
1f5f0 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
1f600 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
1f610 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
1f620 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
1f630 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
1f640 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
1f650 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
1f660 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
1f670 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
1f680 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
1f690 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
1f6a0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1f6b0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
1f6c0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
1f6d0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
1f6e0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
1f6f0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
1f700 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
1f710 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
1f720 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
1f730 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
1f740 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
1f750 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
1f760 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
1f770 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
1f780 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1f790 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1f7a0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
1f7b0 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
1f7c0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1f7d0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
1f7e0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
1f7f0 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
1f800 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
1f810 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
1f820 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1f830 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1f840 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1f850 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
1f860 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
1f870 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
1f880 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1f890 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
1f8a0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
1f8b0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
1f8c0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
1f8d0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
1f8e0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
1f8f0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1f900 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1f910 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
1f940 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
1f950 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1f960 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
1f970 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1f980 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1f990 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1f9a0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
1f9b0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
1f9c0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
1f9d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1f9e0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
1f9f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1fa00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fa10 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
1fa20 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
1fa30 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
1fa40 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
1fa50 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
1fa60 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
1fa70 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
1fa80 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
1fa90 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
1faa0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1fab0 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
1fac0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
1fad0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1faf0 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
1fb00 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1fb10 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1fb20 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1fb30 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1fb40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fb50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1fb60 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1fb70 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
1fb80 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1fb90 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
1fba0 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
1fbb0 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
1fbc0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
1fbd0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1fbe0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1fbf0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
1fc00 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1fc10 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
1fc20 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
1fc30 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
1fc40 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
1fc50 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1fc60 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
1fc70 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1fc80 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1fc90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1fca0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1fcb0 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1fcc0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
1fcd0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1fce0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
1fcf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fd00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
1fd10 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1fd20 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
1fd30 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1fd40 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1fd50 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1fd60 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1fd70 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1fd80 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1fd90 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1fda0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1fdb0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1fdc0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1fdd0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1fde0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1fdf0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1fe00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1fe10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1fe20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1fe30 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
1fe40 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
1fe50 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1fe60 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
1fe70 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
1fe80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1fe90 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fea0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
1feb0 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70  nt c = -1;  /* p
1fec0 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61  Res return if ta
1fed0 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73  ble is empty mus
1fee0 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c  t be -1 */.    l
1fef0 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
1ff00 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1ff10 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  ;.    if( (!pPag
1ff20 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64  e->intKey && pId
1ff30 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c  xKey==0) || upr<
1ff40 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1ff50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1ff60 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1ff70 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1ff80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61     }.    if( bia
1ff90 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  sRight ){.      
1ffa0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1ffb0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
1ffc0 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  upr;.    }else{.
1ffd0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1ffe0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1fff0 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29   (u16)((upr+lwr)
20000 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  /2);.    }.    f
20010 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69 6e  or(;;){.      in
20020 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
20030 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20040 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75  ; /* Index of cu
20050 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
20060 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  age */.      u8 
20070 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
200a0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
200b0 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 70  Page */..      p
200c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
200d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  = 0;.      pCell
200e0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
200f0 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
20100 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
20110 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
20120 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
20130 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
20140 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
20150 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
20160 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d          u32 dumm
20170 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
20180 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ll += getVarint3
20190 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b  2(pCell, dummy);
201a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
201b0 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
201c0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
201d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
201e0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
201f0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
20200 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
20210 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
20220 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
20230 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
20240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20250 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20260 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
20270 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
20280 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
20290 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
202a0 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  dNKey = 1;.     
202b0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
202c0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
202d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
202e0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
202f0 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
20300 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38 20  e-size is 32768 
20310 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
20320 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
20330 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
20340 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
20350 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
20360 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
20370 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
20380 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20 62  s at most 8198 b
20390 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79 20  ytes, which may 
203a0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
203b0 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
203c0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
203d0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
203e0 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
203f0 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
20400 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
20410 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
20420 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
20430 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
20440 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
20450 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
20460 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
20470 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
20480 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
20490 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
204a0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
204b0 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
204c0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
204d0 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
204e0 20 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c       if( !(nCell
204f0 20 26 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c   & 0x80) && nCel
20500 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  l<=pPage->maxLoc
20510 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
20520 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
20530 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
20540 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
20550 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
20560 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
20570 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
20580 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
20590 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
205a0 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
205b0 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
205c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
205d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
205e0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
205f0 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
20600 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
20610 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
20620 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
20630 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
20640 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
20650 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
20660 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
20670 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
20680 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
20690 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
206a0 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
206b0 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
206c0 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
206d0 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
206e0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
206f0 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
20700 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  */.          c =
20710 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20720 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
20730 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
20740 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
20750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
20770 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
20780 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
20790 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
207a0 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
207b0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
207c0 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
207d0 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
207e0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
207f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
20800 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
20810 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
20820 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
20830 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
20840 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
20850 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
20860 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
20870 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
20880 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
20890 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
208a0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
208b0 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
208c0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
208d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
208e0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
208f0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  r(pPage, pCellBo
20900 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
20910 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
20920 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
20930 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
20940 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
20950 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
20960 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ell );.         
20970 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
20980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20990 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
209a0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
209b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
209c0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
209d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
209e0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
209f0 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
20a00 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
20a10 6c 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lKey, 0, 0);.   
20a20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
20a30 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20a40 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
20a50 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
20a60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20a70 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
20a80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
20a90 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f  c ) goto moveto_
20aa0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
20ab0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
20ac0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
20ad0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
20ae0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
20af0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
20b00 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
20b10 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77          upr = lw
20b20 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r - 1;.         
20b30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
20b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20b50 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
20b60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20b70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
20b80 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
20b90 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
20ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20bb0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
20bc0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
20bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20be0 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
20bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20c00 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20  lwr>upr ){.     
20c10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20c20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  }.      pCur->ai
20c30 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20c40 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70   = (u16)((lwr+up
20c50 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
20c60 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
20c70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
20c80 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
20c90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
20ca0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
20cb0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
20cc0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
20cd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
20ce0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
20cf0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
20d00 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
20d10 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
20d20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
20d30 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
20d40 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
20d50 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
20d60 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
20d70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20d80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20d90 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
20da0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20db0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
20dc0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
20dd0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
20de0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20df0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
20e00 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
20e10 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
20e20 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
20e30 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  6)lwr;.    pCur-
20e40 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
20e50 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
20e60 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
20e70 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
20e80 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
20e90 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
20ea0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
20eb0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
20ec0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
20ed0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
20ee0 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
20ef0 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
20f00 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
20f10 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
20f20 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
20f30 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
20f40 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
20f50 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
20f60 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
20f70 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
20f80 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
20f90 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ork..*/.int sqli
20fa0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a  te3BtreeMoveto(.
20fb0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
20fc0 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
20fd0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
20fe0 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
20ff0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
21000 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
21010 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
21020 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
21030 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
21040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
21050 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
21060 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
21070 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
21080 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
21090 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
210a0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
210b0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
210c0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
210d0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
210e0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
210f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
21120 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
21130 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
21140 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
21150 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61   key */.  char a
21160 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20  Space[150];     
21170 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61       /* Temp spa
21180 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d  ce for pIdxKey -
21190 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c   to avoid a mall
211a0 6f 63 20 2a 2f 0a 0a 0a 20 20 69 66 28 20 70 4b  oc */...  if( pK
211b0 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
211c0 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
211d0 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
211e0 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
211f0 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
21200 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
21210 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
21220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73         aSpace, s
21250 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a  izeof(aSpace));.
21260 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
21270 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
21280 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
21290 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
212a0 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
212b0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
212c0 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
212d0 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
212e0 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
212f0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  ( pKey ){.    sq
21300 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
21310 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49  npackedRecord(pI
21320 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65  dxKey);.  }.  re
21330 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
21340 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
21350 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
21360 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
21370 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
21380 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
21390 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
213a0 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
213b0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
213c0 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
213d0 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
213e0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
213f0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
21400 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
21410 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
21420 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
21430 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
21440 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
21450 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
21460 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
21470 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
21480 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
21490 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
214a0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
214b0 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
214c0 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
214d0 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
214e0 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
214f0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
21500 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
21510 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
21520 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
21530 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
21540 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
21550 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
21560 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
21570 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
21580 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
21590 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
215a0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
215b0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
215c0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
215d0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
215e0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
215f0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
21600 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
21610 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
21620 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
21630 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
21640 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
21650 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
21660 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
21670 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
21680 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
21690 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
216a0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
216b0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
216c0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
216d0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
216e0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
216f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21700 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
21710 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
21720 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
21730 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
21740 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
21750 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
21760 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
21770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21780 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30  if( pCur->skip>0
21790 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
217a0 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
217b0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
217c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
217d0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
217e0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
217f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21800 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
21810 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
21820 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
21830 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
21840 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
21850 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43  ( idx<=pPage->nC
21860 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
21870 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
21880 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
21890 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
218a0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
218b0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
218c0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
218d0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
218e0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
218f0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
21900 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
21910 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
21920 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
21930 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
21940 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
21950 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
21960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
21970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
21980 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
21990 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
219a0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
219b0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
219c0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
219d0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
219e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
219f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21a00 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
21a10 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
21a20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
21a30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21a40 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
21a50 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
21a60 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
21a70 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
21a80 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
21a90 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
21aa0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
21ab0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
21ac0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
21ad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
21ae0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21af0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
21b00 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
21b10 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
21b20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
21b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21b40 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
21b50 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
21b60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21b70 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
21b80 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
21b90 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
21ba0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
21bb0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
21bc0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
21bd0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
21be0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
21bf0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
21c00 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
21c10 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
21c20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
21c30 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
21c40 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
21c50 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
21c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21c70 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
21c80 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
21c90 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
21ca0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21cb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
21cc0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21cd0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
21ce0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
21cf0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
21d00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21d10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
21d20 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
21d30 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
21d40 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
21d50 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
21d60 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
21d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21d80 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
21d90 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20  ur->skip<0 ){.  
21da0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
21db0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
21dc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21dd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
21de0 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
21df0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
21e00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21e10 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
21e20 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
21e30 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
21e40 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
21e50 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
21e60 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
21e70 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
21e80 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
21e90 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
21ea0 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
21eb0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
21ec0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
21ed0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
21ee0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
21ef0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
21f00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21f10 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
21f20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
21f30 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
21f40 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
21f50 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
21f60 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
21f70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
21f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21fa0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
21fb0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
21fc0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
21fd0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
21fe0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
21ff0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
22000 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22010 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
22020 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
22030 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
22040 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
22050 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
22060 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
22070 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
22080 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
22090 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
220a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
220b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
220c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
220d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
220e0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
220f0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
22100 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22110 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
22120 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
22130 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
22140 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
22150 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
22160 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
22170 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
22180 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
22190 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
221a0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
221b0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
221c0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
221d0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
221e0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
221f0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
22200 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
22210 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
22220 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22230 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
22240 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
22250 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
22260 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
22270 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
22280 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
22290 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
222a0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
222b0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
222c0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
222d0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
222e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
222f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
22300 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
22310 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
22320 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
22330 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
22340 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
22350 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
22360 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
22370 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
22380 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
22390 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
223a0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
223b0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
223c0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
223d0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
223e0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
223f0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
22400 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
22410 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
22420 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
22430 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
22440 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
22450 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
22460 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
22470 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
22480 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
22490 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
224a0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
224b0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
224c0 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
224d0 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
224e0 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
224f0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
22500 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
22510 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
22520 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
22530 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
22540 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
22550 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
22560 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
22570 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
22580 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
22590 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
225a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
225b0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20    int k;     /* 
225c0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
225d0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
225e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
225f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
22600 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
22610 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
22620 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
22630 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
22640 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
22650 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
22660 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22670 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
22680 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
22690 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
226a0 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61 67 65  .  mxPage = page
226b0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
226c0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
226d0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
226e0 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 6d 78 50  6]);.  if( n>mxP
226f0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
22700 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
22710 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
22720 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
22730 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
22740 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
22750 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
22760 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
22770 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
22780 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
22790 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
227a0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
227b0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
227c0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
227d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
227e0 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
227f0 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
22800 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
22810 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
22820 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
22830 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
22840 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
22850 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
22860 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
22870 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
22880 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
22890 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
228a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
228b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
228c0 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
228d0 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
228e0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
228f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
22900 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
22910 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
22920 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
22930 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
22940 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
22950 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
22960 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
22970 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
22980 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
22990 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
229a0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
229b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
229c0 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
229d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
229e0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
229f0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
22a00 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
22a10 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
22a20 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
22a30 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
22a40 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
22a50 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
22a60 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
22a70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22a80 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
22a90 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
22aa0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
22ab0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
22ac0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
22ad0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
22ae0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
22af0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
22b00 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
22b10 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
22b20 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
22b30 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
22b40 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
22b50 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
22b60 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
22b70 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
22b80 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
22b90 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
22ba0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
22bb0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
22bc0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
22bd0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
22be0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
22bf0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
22c00 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
22c10 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
22c20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
22c30 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
22c40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
22c50 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
22c60 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
22c70 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
22c80 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22c90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
22ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
22cb0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
22cc0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
22cd0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
22ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22cf0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
22d00 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
22d10 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
22d20 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
22d30 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
22d40 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
22d50 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
22d60 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
22d70 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
22d80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
22d90 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
22da0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
22db0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
22dc0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
22dd0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
22de0 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
22df0 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
22e00 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
22e10 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
22e20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
22e30 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
22e40 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
22e50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22e60 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
22e70 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
22e80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22e90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
22ea0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
22eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22ec0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
22ed0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
22ee0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
22ef0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
22f00 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
22f10 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
22f20 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
22f30 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
22f40 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
22f50 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
22f60 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
22f70 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
22f80 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
22f90 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c  if( k>pBt->usabl
22fa0 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
22fb0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
22fc0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
22fd0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
22fe0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
22ff0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23000 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23010 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
23020 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
23030 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23040 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
23050 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
23060 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
23070 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
23080 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
23090 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
230a0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
230b0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
230c0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
230d0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
230e0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
230f0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
23100 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
23110 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
23120 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
23130 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
23140 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
23150 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
23160 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
23170 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
23180 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
23190 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
231a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
231b0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
231c0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
231d0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
231e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
231f0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
23200 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
23210 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
23220 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
23230 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
23240 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23250 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
23260 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
23270 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
23280 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
23290 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
232a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
232b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
232c0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
232d0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
232e0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
232f0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
23300 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
23310 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
23320 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
23330 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
23340 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
23350 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
23360 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23370 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
23380 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
23390 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
233a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
233b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
233c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
233d0 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
233e0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
233f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
23400 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
23410 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
23420 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
23430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
23450 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
23460 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
23470 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
23480 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
234a0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
234b0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
234c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
234d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
234e0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
234f0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
23500 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23510 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23520 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
23530 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
23540 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
23550 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
23560 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
23570 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
23580 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
23590 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
235a0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
235b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
235c0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
235d0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
235e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
235f0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
23600 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
23610 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
23620 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
23630 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
23640 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
23650 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
23660 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
23670 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23680 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
23690 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
236a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
236b0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
236c0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
236d0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
236e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
236f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23700 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
23710 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
23720 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
23730 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
23740 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
23750 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
23760 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23770 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
23780 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
23790 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
237a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
237b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
237c0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
237d0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
237e0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
237f0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
23800 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
23810 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
23820 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
23830 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
23840 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
23850 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
23860 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a     int closest;.
23870 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
23880 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
23890 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
238a0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
238b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
238c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
238d0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
238e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
238f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
23900 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
23910 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
23920 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
23930 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
23940 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a     int i, dist;.
23950 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
23960 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
23970 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65   dist = get4byte
23980 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
23990 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
239a0 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73  if( dist<0 ) dis
239b0 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20  t = -dist;.     
239c0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
239d0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
239e0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65       int d2 = ge
239f0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
23a00 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  i*4]) - nearby;.
23a10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23a20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b  d2<0 ) d2 = -d2;
23a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23a40 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
23a50 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
23a60 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
23a70 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
23a80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23ab0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
23ac0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
23ad0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
23ae0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
23af0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
23b00 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
23b10 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
23b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
23b30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
23b40 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
23b50 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
23b60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
23b70 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c  ( !searchList ||
23b80 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29   iPage==nearby )
23b90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
23ba0 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
23bb0 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
23bc0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
23bd0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
23be0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61 67       nPage = pag
23bf0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
23c00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23c10 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29 7b 0a  *pPgno>nPage ){.
23c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23c30 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65  ree page off the
23c40 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
23c50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
23c70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
23c80 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
23c90 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
23ca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23cb0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
23cc0 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
23cd0 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
23ce0 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
23cf0 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
23d00 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
23d10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23d20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
23d30 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
23d40 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
23d50 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
23d60 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
23d70 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
23d80 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
23d90 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
23da0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
23db0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
23dc0 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
23dd0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
23de0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23df0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
23e00 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
23e10 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) );.          n
23e20 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
23e30 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
23e40 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20  Bt, *pPgno);.   
23e50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23e60 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
23e70 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
23e80 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
23e90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23ea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23ed0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
23ee0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23ef0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23f00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23f10 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
23f20 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
23f30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23f50 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
23f60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23f70 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
23f80 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
23f90 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
23fa0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
23fb0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
23fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23fd0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
23fe0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
23ff0 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20  list, so create 
24000 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68  a new page at th
24010 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
24020 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
24030 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65  int nPage = page
24040 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
24050 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50  .    *pPgno = nP
24060 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66  age + 1;..    if
24070 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
24080 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
24090 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e   ){.      (*pPgn
240a0 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  o)++;.    }..#if
240b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
240c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
240d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
240e0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
240f0 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
24100 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
24110 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
24120 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
24130 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
24140 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
24150 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
24160 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
24170 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
24180 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
24190 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
241a0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
241b0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
241c0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
241d0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
241e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
241f0 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
24200 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
24210 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
24220 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
24230 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
24240 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
24250 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
24260 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
24270 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
24280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24290 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
242a0 74 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c  t, *pPgno, &pPg,
242b0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
242c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
242d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
242e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
242f0 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
24300 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
24310 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
24320 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
24330 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
24340 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
24350 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
24360 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
24370 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29  pBt) ){ (*pPgno)
24380 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
24390 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
243a0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
243b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
243c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
243d0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
243e0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
243f0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
24400 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
24410 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24420 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
24430 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
24440 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
24460 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
24470 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
24480 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
24490 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
244a0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
244b0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
244c0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
244d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
244e0 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
244f0 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
24500 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
24510 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
24520 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
24530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24540 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
24550 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
24560 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
24570 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
24580 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
24590 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
245a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
245b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
245c0 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
245d0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
245e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
245f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24600 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
24610 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
24620 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24630 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
24640 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
24650 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
24660 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
24670 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
24680 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
24690 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
246a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
246b0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
246c0 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
246d0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
246e0 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
246f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24700 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
24710 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
24720 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
24730 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
24740 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
24750 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
24760 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
24770 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
24780 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
24790 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
247a0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
247b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
247c0 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
247d0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
247e0 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
247f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
24800 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
24810 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
24820 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
24830 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
24840 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
24850 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
24860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
24870 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
24880 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
24890 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
248a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
248b0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
248c0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
248d0 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
248e0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
248f0 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
24900 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
24910 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
24920 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24940 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
24950 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
24960 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
24970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24990 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
249a0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
249d0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
249e0 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
249f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
24a00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
24a10 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
24a20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20  assert( iPage>1 
24a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
24a40 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
24a50 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
24a60 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  );..  if( pMemPa
24a70 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
24a80 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
24a90 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
24aa0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
24ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
24ac0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
24ad0 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
24ae0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
24af0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
24b00 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
24b10 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
24b20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24b30 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
24b40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
24b50 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
24b60 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
24b70 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
24b80 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
24b90 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
24ba0 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
24bb0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
24bc0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
24bd0 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
24be0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
24bf0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
24c00 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
24c10 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
24c20 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
24c30 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
24c40 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
24c50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21 70 50  .  */.  if( (!pP
24c60 61 67 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  age && (rc = sql
24c70 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
24c80 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
24c90 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c 20  age, 0))).   || 
24ca0 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20 3d             (rc =
24cb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24cc0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
24cd0 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74  e)).  ){.    got
24ce0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
24cf0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50 61    }.  memset(pPa
24d00 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
24d10 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
24d20 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
24d30 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
24d40 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
24d50 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
24d60 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
24d70 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
24d80 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
24d90 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
24da0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
24db0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
24dc0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
24dd0 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
24de0 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b  AP_FREEPAGE, 0);
24df0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
24e00 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
24e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
24e20 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
24e30 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
24e40 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
24e50 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
24e60 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
24e70 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
24e80 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
24e90 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
24ea0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
24eb0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
24ec0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
24ed0 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
24ee0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
24ef0 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
24f00 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
24f10 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
24f20 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
24f30 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
24f40 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
24f50 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
24f60 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
24f70 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
24f80 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
24f90 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
24fa0 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
24fb0 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
24fc0 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
24fd0 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 3b 20 20      int nLeaf;  
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ff0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
25000 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
25010 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
25020 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
25030 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
25040 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
25050 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
25060 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
25070 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
25080 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
25090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
250a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
250b0 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
250c0 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
250d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
250e0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61  ]);.    if( nLea
250f0 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  f<0 ){.      rc 
25100 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
25110 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
25120 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
25130 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
25140 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53  eaf<pBt->usableS
25150 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
25160 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
25170 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
25180 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
25190 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
251a0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
251b0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
251c0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
251d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
251e0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
251f0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
25200 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
25210 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
25220 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
25230 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
25240 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
25250 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
25260 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
25270 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
25280 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
25290 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
252a0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
252b0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
252c0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
252d0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
252e0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
252f0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
25300 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
25310 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
25320 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
25330 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
25340 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
25350 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
25360 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
25370 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
25380 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
25390 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61  ** we will conta
253a0 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  in to restrict t
253b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
253c0 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
253d0 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
253e0 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
253f0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
25400 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
25410 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
25420 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
25430 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
25440 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
25450 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
25460 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
25470 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
25480 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
25490 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
254a0 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
254b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
254c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
254d0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
254e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
254f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25500 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
25510 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
25520 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
25530 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
25540 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
25550 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
25560 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
25570 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
25580 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
25590 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
255a0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
255b0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
255c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
255d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
255e0 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
255f0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
25600 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
25610 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
25620 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
25630 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
25640 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
25650 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
25660 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
25670 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
25680 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
25690 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
256a0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
256b0 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
256c0 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
256d0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
256e0 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
256f0 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
25700 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
25710 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
25720 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
25730 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
25740 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
25750 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
25760 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
25770 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
25780 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
25790 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
257a0 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
257b0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
257c0 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
257d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
257e0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
257f0 66 28 20 20 20 28 28 21 70 50 61 67 65 29 20 26  f(   ((!pPage) &
25800 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  & (0 != (rc = sq
25810 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
25820 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
25830 50 61 67 65 2c 20 30 29 29 29 29 0a 20 20 20 20  Page, 0)))).    
25840 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
25850 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25860 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
25870 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74  ))).  ){.    got
25880 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
25890 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
258a0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
258b0 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
258c0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
258d0 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
258e0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
258f0 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
25900 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
25910 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
25920 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
25930 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
25940 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
25950 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
25960 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
25970 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
25980 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
25990 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
259a0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
259b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
259c0 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  }.static int fre
259d0 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
259e0 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
259f0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
25a00 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
25a10 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  ge->pgno);.}../*
25a20 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
25a30 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
25a40 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
25a50 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73  given Cell..*/.s
25a60 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
25a70 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
25a80 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ge, unsigned cha
25a90 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53  r *pCell){.  BtS
25aa0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
25ab0 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
25ac0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
25ad0 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
25ae0 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
25af0 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50 61 67 65  ;.  u16 ovflPage
25b00 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
25b10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25b20 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
25b30 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
25b40 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
25b50 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
25b60 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
25b70 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
25b80 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
25b90 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
25ba0 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
25bb0 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
25bc0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
25bd0 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
25be0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
25bf0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
25c00 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  low]);.  assert(
25c10 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
25c20 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
25c30 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
25c40 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
25c50 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
25c60 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
25c70 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
25c80 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
25c90 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
25ca0 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
25cb0 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
25cc0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
25cd0 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
25ce0 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
25cf0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
25d00 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
25d10 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50   ovflPgno>pagerP
25d20 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
25d30 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
25d40 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
25d50 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
25d60 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
25d70 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
25d80 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
25d90 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
25da0 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
25db0 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
25dc0 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
25dd0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
25de0 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
25df0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25e00 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
25e10 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
25e20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
25e30 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
25e40 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
25e50 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
25e60 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
25e70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
25e80 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
25e90 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
25ea0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76  no);.    if( pOv
25eb0 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
25ec0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
25ed0 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
25ee0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
25ef0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
25f00 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
25f10 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
25f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25f30 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
25f40 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
25f50 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
25f60 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
25f70 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
25f80 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
25f90 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
25fa0 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
25fb0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
25fc0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
25fd0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
25fe0 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
25ff0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
26000 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
26010 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
26020 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
26030 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
26040 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
26050 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
26060 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
26070 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
26080 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
26090 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
260a0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
260b0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
260c0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
260d0 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
260e0 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
260f0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
26100 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
26110 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
26120 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
26130 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
26140 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
26150 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
26160 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26170 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
26180 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
26190 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
261a0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
261b0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
261c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
261d0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
261e0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
261f0 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
26200 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
26210 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
26220 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
26230 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
26260 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
26270 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
26280 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
26290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
262a0 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
262b0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
262c0 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
262d0 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
262e0 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
262f0 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
26300 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
26310 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
26320 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
26330 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
26340 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
26350 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
26360 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
26370 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
26380 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
26390 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
263a0 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
263b0 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
263c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
263d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
263e0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
263f0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
26400 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
26410 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
26420 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
26430 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
26440 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
26450 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
26460 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
26470 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
26480 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
26490 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
264a0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
264b0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
264c0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
264d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
264e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
264f0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
26500 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
26510 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
26520 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
26530 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
26540 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
26550 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
26560 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
26570 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
26580 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74  l[nHeader], nDat
26590 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73  a+nZero);.  }els
265a0 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e  e{.    nData = n
265b0 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Zero = 0;.  }.  
265c0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
265d0 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
265e0 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
265f0 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ey);.  sqlite3Bt
26600 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
26610 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
26620 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
26630 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48  info.nHeader==nH
26640 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72  eader );.  asser
26650 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
26660 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
26670 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32  info.nData==(u32
26680 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29  )(nData+nZero) )
26690 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
266a0 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
266b0 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
266c0 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
266d0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
266e0 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
266f0 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
26700 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
26710 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20  a = 0;.  }else{ 
26720 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3e 30 78  .    if( nKey>0x
26730 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
26740 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
26750 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
26760 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  PT;.    }.    nP
26770 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e  ayload += (int)n
26780 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
26790 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
267a0 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a   (int)nKey;.  }.
267b0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
267c0 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
267d0 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
267e0 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
267f0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
26800 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
26810 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
26820 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
26830 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
26840 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
26850 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
26860 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26870 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
26880 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
26890 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
268a0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
268b0 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
268c0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
268d0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
268e0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
268f0 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
26900 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
26910 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
26920 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
26930 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
26940 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
26950 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
26960 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
26970 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
26980 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
26990 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
269a0 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
269b0 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
269c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
269d0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
269e0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
269f0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
26a00 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
26a10 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
26a20 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
26a30 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
26a40 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
26a50 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
26a60 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
26a70 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
26a80 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
26a90 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
26aa0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
26ab0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
26ac0 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
26ad0 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
26ae0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
26af0 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
26b00 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
26b10 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
26b20 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
26b30 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
26b40 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
26b50 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
26b60 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
26b70 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
26b80 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
26b90 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75  initialised valu
26ba0 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
26bb0 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
26bc0 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
26bd0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
26be0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
26bf0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
26c00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26c10 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
26c20 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
26c30 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
26c40 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
26c50 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  1);.        rc =
26c60 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
26c70 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
26c80 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20   pgnoPtrmap);.  
26c90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
26ca0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
26cb0 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
26cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26cd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
26ce0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
26cf0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
26d00 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
26d10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
26d20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
26d30 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
26d40 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
26d50 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
26d60 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
26d70 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
26d80 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
26d90 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
26da0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
26db0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
26dc0 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
26dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
26de0 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
26df0 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
26e00 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
26e10 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
26e20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
26e30 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
26e40 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
26e50 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
26e60 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
26e70 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
26e80 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
26e90 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
26ea0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
26eb0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
26ec0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
26ed0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
26ee0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
26ef0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
26f00 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
26f10 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
26f20 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
26f30 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
26f40 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
26f50 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
26f60 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
26f70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
26f80 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
26f90 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
26fa0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
26fb0 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
26fc0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
26fd0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
26fe0 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
26ff0 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
27000 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
27010 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
27020 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
27030 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
27040 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
27050 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
27060 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
27070 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
27080 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
27090 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
270a0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
270b0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
270c0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
270d0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
270e0 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
270f0 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
27100 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
27110 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
27120 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
27130 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
27140 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
27150 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
27160 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
27170 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
27180 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
27190 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
271a0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
271b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
271c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
271d0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
271e0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
271f0 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
27200 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
27210 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
27220 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
27230 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
27240 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
27250 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
27260 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
27270 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
27280 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
27290 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
272a0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
272b0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
272c0 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
272d0 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
272e0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
272f0 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
27300 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
27310 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
27320 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
27330 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
27340 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
27350 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
27360 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
27370 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
27380 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
27390 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
273a0 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
273b0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
273c0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
273d0 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
273e0 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
273f0 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
27400 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
27410 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
27420 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
27430 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
27440 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
27450 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
27460 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
27470 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
27480 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
27490 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
274a0 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e  x, int sz){.  in
274b0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
274c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
274d0 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
274e0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
274f0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
27500 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
27510 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
27520 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
27530 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
27540 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
27550 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
27560 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
27570 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
27580 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
27590 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
275a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
275b0 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
275c0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
275d0 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
275e0 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
275f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
27600 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
27610 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
27620 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
27630 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27640 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
27650 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
27660 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
27670 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70  .  ptr = &data[p
27680 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
27690 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20   + 2*idx];.  pc 
276a0 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
276b0 0a 20 20 69 66 28 20 28 70 63 3c 70 50 61 67 65  .  if( (pc<pPage
276c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
276d0 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 29  Page->leaf?0:4))
276e0 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b 73 7a 3e  .     || (pc+sz>
276f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
27700 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 72  leSize) ){.    r
27710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
27720 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
27730 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
27740 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
27750 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27760 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
27770 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  n rc;.  }.  for(
27780 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65  i=idx+1; i<pPage
27790 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74  ->nCell; i++, pt
277a0 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30  r+=2){.    ptr[0
277b0 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20  ] = ptr[2];.    
277c0 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b  ptr[1] = ptr[3];
277d0 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
277e0 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74  ell--;.  put2byt
277f0 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
27800 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61  drOffset+3], pPa
27810 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
27820 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
27830 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27840 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
27850 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
27860 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
27870 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
27880 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
27890 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
278a0 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
278b0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
278c0 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
278d0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
278e0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
278f0 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
27900 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
27910 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
27920 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
27930 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
27940 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
27950 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
27960 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
27970 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
27980 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
27990 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
279a0 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
279b0 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
279c0 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
279d0 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
279e0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
279f0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
27a00 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
27a10 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
27a20 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
27a30 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
27a40 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
27a50 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
27a60 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
27a70 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
27a80 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
27a90 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
27aa0 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
27ab0 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
27ac0 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
27ad0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
27ae0 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
27af0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
27b00 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
27b10 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
27b20 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
27b30 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
27b40 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
27b50 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
27b60 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
27b70 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
27b80 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
27b90 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
27ba0 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
27bb0 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
27bc0 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
27bd0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
27be0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
27bf0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
27c00 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
27c10 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
27c20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
27c30 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
27c40 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
27c50 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
27c60 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
27c70 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
27c80 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
27c90 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
27ca0 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20  u8 nSkip        
27cb0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74    /* Do not writ
27cc0 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
27cd0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  p bytes of the c
27ce0 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ell */.){.  int 
27cf0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
27d00 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
27d10 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
27d20 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
27d30 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
27d40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
27d50 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  r */.  int top; 
27d60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
27d70 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e  t byte of conten
27d80 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69  t for any cell i
27d90 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
27da0 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
27db0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
27dc0 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
27dd0 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
27de0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
27df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
27e00 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
27e10 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
27e20 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
27e30 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
27e40 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
27e50 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20   into data[] of 
27e60 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
27e70 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
27e80 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
27e90 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
27ea0 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
27eb0 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
27ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27ed0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
27ee0 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
27ef0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
27f00 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
27f10 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
27f20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
27f30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
27f40 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
27f50 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
27f60 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
27f70 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
27f80 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
27f90 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
27fa0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35  L(pPage->pBt)<=5
27fb0 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  460 );.  assert(
27fc0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
27fd0 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
27fe0 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20  ge->aOvfl) );.  
27ff0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
28000 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
28010 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
28020 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28030 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
28040 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
28050 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
28060 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
28070 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
28080 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
28090 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
280a0 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
280b0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
280c0 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
280d0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  p;.    }.    j =
280e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
280f0 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
28100 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
28110 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
28120 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
28130 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
28140 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
28150 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
28160 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
28170 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20  .idx = (u16)i;. 
28180 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
28190 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
281a0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
281b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
281c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
281d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
281e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
281f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
28200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
28210 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
28220 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
28230 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
28240 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
28250 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
28260 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f  drOffset;.    to
28270 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
28280 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
28290 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
282a0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
282b0 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
282c0 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
282d0 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69  nCell + 2;.    i
282e0 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
282f0 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65  + 2*i;.    if( e
28300 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b  nd > top - sz ){
28310 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 66 72  .      rc = defr
28320 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
28330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
28340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28350 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
28370 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
28380 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
28390 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b     assert( end +
283a0 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20   sz <= top );.  
283b0 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c    }.    idx = al
283c0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
283d0 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65  e, sz);.    asse
283e0 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20  rt( idx>0 );.   
283f0 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20   assert( end <= 
28400 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
28410 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69 66  dr+5]) );.    if
28420 20 28 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65   (idx+sz > pPage
28430 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
28440 65 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e) {.      retur
28450 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28460 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
28470 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
28480 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
28490 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63  e -= 2;.    memc
284a0 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
284b0 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
284c0 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
284d0 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74   for(j=end-2, pt
284e0 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e  r=&data[j]; j>in
284f0 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29  s; j-=2, ptr-=2)
28500 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d  {.      ptr[0] =
28510 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20   ptr[-2];.      
28520 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d  ptr[1] = ptr[-1]
28530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
28540 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
28550 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
28560 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
28570 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
28580 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28590 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
285a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
285b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
285c0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
285d0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
285e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
285f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
28600 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
28610 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
28620 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
28630 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
28640 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
28650 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e   */.      CellIn
28660 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73  fo info;.      s
28670 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
28680 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
28690 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
286a0 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
286b0 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
286c0 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
286d0 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
286e0 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  oad );.      if(
286f0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
28700 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
28710 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
28720 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
28730 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
28740 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
28750 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
28760 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
28770 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
28780 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
28790 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
287a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
287b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
287c0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
287d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
287e0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
287f0 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
28800 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
28810 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
28820 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
28830 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
28840 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
28850 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
28860 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
28870 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
28880 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
28890 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
288a0 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
288b0 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
288c0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
288d0 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
288e0 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
288f0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
28900 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
28910 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
28920 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
28930 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
28940 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
28950 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
28960 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
28970 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
28980 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
28990 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
289a0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
289b0 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
289c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
289d0 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
289e0 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
289f0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
28a00 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
28a10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
28a20 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
28a30 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
28a40 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
28a50 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
28a60 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
28a70 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
28a80 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
28a90 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
28aa0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
28ab0 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
28ac0 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
28ad0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
28ae0 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
28af0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28b00 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
28b10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
28b20 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
28b30 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  & nCell<=MX_CELL
28b40 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
28b50 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
28b60 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61  Bt)<=5460 );.  a
28b70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
28b80 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
28b90 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
28ba0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
28bb0 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  at the page has 
28bc0 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64  just been zeroed
28bd0 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a   by zeroPage() *
28be0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
28bf0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
28c00 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
28c10 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d  e(&data[hdr+5])=
28c20 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70  =nUsable );..  p
28c30 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b  Cellptr = &data[
28c40 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
28c50 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  t + nCell*2];.  
28c60 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62  cellbody = nUsab
28c70 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c  le;.  for(i=nCel
28c80 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
28c90 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d  .    pCellptr -=
28ca0 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   2;.    cellbody
28cb0 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   -= aSize[i];.  
28cc0 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
28cd0 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  ptr, cellbody);.
28ce0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
28cf0 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
28d00 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29  ll[i], aSize[i])
28d10 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
28d20 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
28d30 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
28d40 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
28d50 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
28d60 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43  ge->nFree -= (nC
28d70 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20  ell*2 + nUsable 
28d80 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  - cellbody);.  p
28d90 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75  Page->nCell = (u
28da0 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  16)nCell;.}../*.
28db0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
28dc0 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
28dd0 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
28de0 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
28df0 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
28e00 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
28e10 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
28e20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
28e30 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
28e40 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
28e50 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
28e60 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
28e70 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
28e80 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
28e90 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
28ea0 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
28eb0 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
28ec0 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
28ed0 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
28ee0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
28ef0 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
28f00 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
28f10 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
28f20 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
28f30 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
28f40 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
28f50 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
28f60 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
28f70 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
28f80 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
28f90 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
28fa0 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
28fb0 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
28fc0 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
28fd0 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
28fe0 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
28ff0 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
29000 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
29010 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
29020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29030 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
29040 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
29050 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
29060 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
29070 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
29080 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
29090 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
290a0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
290b0 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
290c0 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75  int balance(BtCu
290d0 72 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69  rsor*, int);..#i
290e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
290f0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
29100 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
29110 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
29120 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
29130 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
29140 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
29150 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
29160 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
29170 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
29180 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
29190 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
291a0 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
291b0 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
291c0 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
291d0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
291e0 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
291f0 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20   trying balance 
29200 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
29210 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
29220 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
29230 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
29240 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
29250 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
29260 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
29270 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
29280 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
29290 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
292a0 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
292b0 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
292c0 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
292d0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
292e0 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
292f0 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
29300 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
29310 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
29320 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
29330 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
29340 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
29350 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
29360 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
29370 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
29380 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
29390 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
293a0 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
293b0 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
293c0 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
293d0 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
293e0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
293f0 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
29400 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
29410 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
29420 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
29430 0a 20 20 4d 65 6d 50 61 67 65 20 2a 63 6f 6e 73  .  MemPage *cons
29440 74 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t pPage = pCur->
29450 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29460 67 65 5d 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ge];.  BtShared 
29470 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 43 75  *const pBt = pCu
29480 72 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  r->pBt;.  MemPag
29490 65 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  e *pNew = 0;    
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
294b0 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
294c0 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
294d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294f0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
29500 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
29510 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
29520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
29530 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77  e number of pNew
29540 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
29550 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
29560 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
29570 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
29580 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20  age->nCell<=0 ) 
29590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
295a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f  RRUPT_BKPT;..  /
295b0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
295c0 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65   page. This page
295d0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
295e0 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
295f0 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 72 63 20  f pPage */.  rc 
29600 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
29610 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
29620 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
29630 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
29640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
29650 54 68 65 20 70 61 72 65 6e 74 43 65 6c 6c 20 62  The parentCell b
29660 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f  uffer is used to
29670 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61   store a tempora
29680 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64  ry copy of the d
29690 69 76 69 64 65 72 0a 20 20 20 20 2a 2a 20 63 65  ivider.    ** ce
296a0 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ll that will be 
296b0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50  inserted into pP
296c0 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65  arent. Such a ce
296d0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
296e0 20 34 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 70   4.    ** byte p
296f0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f  age number follo
29700 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c  wed by a variabl
29710 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
29720 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 2a  . In other.    *
29730 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
29740 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
29750 20 74 68 65 20 70 61 72 65 6e 74 43 65 6c 6c 20   the parentCell 
29760 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61  buffer must be a
29770 74 0a 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 31  t.    ** least 1
29780 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  3 bytes in size.
29790 0a 20 20 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  .    */.    MemP
297a0 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72  age * const pPar
297b0 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  ent = pCur->apPa
297c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
297d0 5d 3b 0a 20 20 20 20 75 38 20 70 61 72 65 6e 74  ];.    u8 parent
297e0 43 65 6c 6c 5b 31 33 5d 3b 0a 20 20 20 20 75 38  Cell[13];.    u8
297f0 20 2a 70 4f 75 74 20 3d 20 26 70 61 72 65 6e 74   *pOut = &parent
29800 43 65 6c 6c 5b 34 5d 3b 0a 20 20 20 20 75 38 20  Cell[4];.    u8 
29810 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
29820 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
29830 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
29840 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
29850 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
29860 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
29870 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
29880 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
29890 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
298a0 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
298b0 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  New, pPage->aDat
298c0 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d  a[0]);.    assem
298d0 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
298e0 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
298f0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
29900 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a  verflow = 0;.  .
29910 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
29920 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
29930 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
29940 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
29950 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
29960 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
29970 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
29980 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
29990 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
299a0 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
299b0 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
299c0 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
299d0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
299e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
299f0 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
29a00 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
29a10 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
29a20 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
29a30 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
29a40 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
29a50 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
29a60 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
29a70 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
29a80 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
29a90 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
29aa0 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
29ab0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
29ac0 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
29ad0 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
29ae0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
29af0 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
29b00 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
29b10 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
29b20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
29b30 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
29b40 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
29b50 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
29b60 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
29b70 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
29b80 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
29b90 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
29ba0 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
29bb0 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
29bc0 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
29bd0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 43  into the parentC
29be0 65 6c 6c 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ell buffer..    
29bf0 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
29c00 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 50 61 67  parentCell, pPag
29c10 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 43  e->pgno);.    pC
29c20 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
29c30 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
29c40 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70  ll-1);.    pStop
29c50 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
29c60 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c    while( (*(pCel
29c70 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43  l++)&0x80) && pC
29c80 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20  ell<pStop );.   
29c90 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
29ca0 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
29cb0 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70  (*(pOut++) = *(p
29cc0 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26  Cell++))&0x80) &
29cd0 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
29ce0 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ..    /* Insert 
29cf0 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
29d00 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e  cell into pParen
29d10 74 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  t */.    insertC
29d20 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
29d30 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 61 72  rent->nCell, par
29d40 65 6e 74 43 65 6c 6c 2c 20 70 4f 75 74 2d 70 61  entCell, pOut-pa
29d50 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 30 29 3b  rentCell, 0, 0);
29d60 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
29d70 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
29d80 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20  nter of pParent 
29d90 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
29da0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
29db0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
29dc0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
29dd0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
29de0 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
29df0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
29e00 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
29e10 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
29e20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
29e30 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
29e40 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
29e50 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
29e60 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
29e70 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
29e80 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
29e90 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20  erflow page..   
29ea0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
29eb0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
29ec0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29ed0 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
29ee0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
29ef0 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  rent->pgno);.   
29f00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29f10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29f20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
29f30 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20  fl(pNew, 0);.   
29f40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29f50 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
29f60 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
29f70 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
29f80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
29f90 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  w);.  }..  /* At
29fa0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
29fb0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 76 61 72  pPage->nFree var
29fc0 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74  iable is not set
29fd0 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68 0a   correctly with.
29fe0 20 20 2a 2a 20 72 65 73 70 65 63 74 20 74 6f 20    ** respect to 
29ff0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2a000 68 65 20 70 61 67 65 20 28 62 65 63 61 75 73 65  he page (because
2a010 20 69 74 20 77 61 73 20 73 65 74 20 74 6f 20 30   it was set to 0
2a020 20 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74   by .  ** insert
2a030 43 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73  Cell). So call s
2a040 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2a050 61 67 65 28 29 20 74 6f 20 6d 61 6b 65 20 73 75  age() to make su
2a060 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f  re it is.  ** co
2a070 72 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rrect..  **.  **
2a080 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20   This has to be 
2a090 64 6f 6e 65 20 65 76 65 6e 20 69 66 20 61 6e 20  done even if an 
2a0a0 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
2a0b0 74 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79  turned. Normally
2a0c0 2c 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  , if.  ** an err
2a0d0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
2a0e0 20 74 72 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c   tree balancing,
2a0f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2a100 20 4d 65 6d 50 61 67 65 20 61 72 65 0a 20 20 2a   MemPage are.  *
2a110 2a 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c  * not important,
2a120 20 61 73 20 74 68 65 79 20 77 69 6c 6c 20 62 65   as they will be
2a130 20 72 65 63 61 6c 63 75 6c 61 74 65 64 20 77 68   recalculated wh
2a140 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 72  en the page is r
2a150 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e  olled.  ** back.
2a160 20 42 75 74 20 68 65 72 65 2c 20 69 6e 20 62 61   But here, in ba
2a170 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20 69  lance_quick(), i
2a180 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
2a190 61 74 20 70 50 61 67 65 20 68 61 73 20 0a 20 20  at pPage has .  
2a1a0 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
2a1b0 6d 61 72 6b 65 64 20 64 69 72 74 79 20 6f 72 20  marked dirty or 
2a1c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2a1d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2a1e0 68 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74  herefore.  ** it
2a1f0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c   will not be rol
2a200 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 73 6f 20  led back and so 
2a210 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
2a220 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
2a230 74 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  t.  ** the page 
2a240 64 61 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74  data and content
2a250 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65  s of MemPage are
2a260 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a   consistent..  *
2a270 2f 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  /.  pPage->isIni
2a280 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
2a290 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
2a2a0 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
2a2b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2a2c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
2a2d0 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20  everything else 
2a2e0 73 75 63 63 65 65 64 65 64 2c 20 62 61 6c 61 6e  succeeded, balan
2a2f0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
2a300 67 65 2c 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73  ge, in .  ** cas
2a310 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
2a320 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73  ll inserted caus
2a330 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20  ed it to become 
2a340 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20  overfull..  */. 
2a350 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a360 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
2a370 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2a380 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
2a390 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
2a3a0 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a  e(pCur, 0);.  }.
2a3b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2a3c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2a3d0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2a3e0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E */../*.** This
2a3f0 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72   routine redistr
2a400 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20  ibutes Cells on 
2a410 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
2a420 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  NN*2 siblings.**
2a430 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61   of pPage so tha
2a440 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  t all pages have
2a450 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20   about the same 
2a460 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
2a470 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79  pace..** Usually
2a480 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
2a490 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
2a4a0 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20  Page is used in 
2a4b0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a  the balancing,.*
2a4c0 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69  * though more si
2a4d0 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
2a4e0 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20  e from one side 
2a4f0 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
2a500 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74  first.** or last
2a510 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
2a520 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20  rent.  If pPage 
2a530 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
2a540 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  *NN siblings.** 
2a550 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
2a560 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2a570 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
2a580 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20   root page or a 
2a590 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f  .** child of roo
2a5a0 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  t) then all avai
2a5b0 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70  lable siblings p
2a5c0 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
2a5d0 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a  e balancing..**.
2a5e0 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
2a5f0 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
2a600 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
2a610 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
2a620 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20  ed by one or.** 
2a630 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
2a640 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
2a650 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
2a660 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68  ot over full. Th
2a670 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  e root page.** i
2a680 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73  s special and is
2a690 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e   allowed to be n
2a6a0 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20  early empty. If 
2a6b0 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65  pPage is .** the
2a6c0 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
2a6d0 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
2a6e0 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20  e tree might be 
2a6f0 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20  increased.** or 
2a700 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
2a710 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20  , as necessary, 
2a720 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74  to keep the root
2a730 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67   page from being
2a740 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  .** overfull or 
2a750 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
2a760 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2a770 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
2a780 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
2a790 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73  ome of the Cells
2a7a0 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   on pPage.** mig
2a7b0 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
2a7c0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  be stored in pPa
2a7d0 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68  ge->aData[].  Th
2a7e0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
2a7f0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2a800 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20  overfull.  Part 
2a810 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68  of the job of th
2a820 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
2a830 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  .** make sure al
2a840 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67  l Cells for pPag
2a850 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74  e once again fit
2a860 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
2a870 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  []..**.** In the
2a880 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
2a890 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67  cing the sibling
2a8a0 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20  s of pPage, the 
2a8b0 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a  parent of pPage.
2a8c0 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20  ** might become 
2a8d0 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
2a8e0 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20  rfull.  If that 
2a8f0 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68  happens, then th
2a900 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
2a910 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
2a920 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ely on the paren
2a930 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
2a940 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
2a950 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
2a960 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
2a970 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
2a980 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
2a990 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  te.  So if this 
2a9a0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
2a9b0 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
2a9c0 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
2a9d0 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
2a9e0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
2a9f0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
2aa00 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2aa10 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
2aa20 20 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 20      /* The over 
2aa30 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 70 61 67  or underfull pag
2aa40 65 20 74 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a  e to balance */.
2aa50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
2aa60 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
2aa70 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20  * The parent of 
2aa80 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61  pPage */.  BtSha
2aa90 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2aaa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
2aab0 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  hole database */
2aac0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30  .  int nCell = 0
2aad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aae0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
2aaf0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
2ab00 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
2ab10 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2ab20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
2ab30 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a  ze of apCell, sz
2ab40 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a  Cell, aFrom. */.
2ab50 20 20 69 6e 74 20 6e 4f 6c 64 20 3d 20 30 3b 20    int nOld = 0; 
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ab70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2ab80 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  s in apOld[] */.
2ab90 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20    int nNew = 0; 
2aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2abb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2abc0 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  s in apNew[] */.
2abd0 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20    int nDiv;     
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2abf0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
2ac00 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a  s in apDiv[] */.
2ac10 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20    int i, j, k;  
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac30 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2ac40 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  */.  int idx;   
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50    /* Index of pP
2ac70 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  age in pParent->
2ac80 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
2ac90 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
2aca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2acb0 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
2acc0 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
2acd0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acf0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
2ad00 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2ad10 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2ad20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
2ad30 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2ad40 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
2ad50 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ad70 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
2ad80 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
2ad90 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
2ada0 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
2adb0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2adc0 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
2add0 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
2ade0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
2adf0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
2ae00 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2ae10 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2ae20 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
2ae30 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2ae40 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
2ae50 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
2ae60 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
2ae70 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
2ae80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2ae90 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2aea0 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
2aeb0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
2aec0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
2aed0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
2aee0 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
2aef0 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  e2[] */.  int sz
2af00 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20  Scratch;        
2af10 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2af20 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79  f scratch memory
2af30 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
2af40 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e  MemPage *apOld[N
2af50 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  B];          /* 
2af60 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
2af70 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  two siblings */.
2af80 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e    Pgno pgnoOld[N
2af90 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  B];            /
2afa0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
2afb0 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2afc0 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  apOld[] */.  Mem
2afd0 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
2afe0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
2aff0 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
2b000 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
2b010 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
2b020 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
2b030 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
2b040 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
2b050 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
2b060 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b  .  Pgno pgnoNew[
2b070 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2b080 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20  /* Page numbers 
2b090 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2b0a0 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38   apNew[] */.  u8
2b0b0 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20   *apDiv[NB];    
2b0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2b0d0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
2b0e0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
2b0f0 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
2b100 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2b110 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
2b120 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
2b130 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
2b140 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2b150 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
2b160 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
2b170 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
2b180 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2b190 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2b1a0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
2b1b0 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
2b1c0 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
2b1d0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2b1e0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
2b1f0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
2b200 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
2b210 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20  u8 *aCopy[NB];  
2b220 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
2b230 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  for holding data
2b240 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a   of apCopy[] */.
2b250 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20    u8 *aSpace1;  
2b260 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
2b270 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
2b280 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62  dividers cells b
2b290 65 66 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f  efore balance */
2b2a0 0a 20 20 75 38 20 2a 61 53 70 61 63 65 32 20 3d  .  u8 *aSpace2 =
2b2b0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 70 61   0;       /* Spa
2b2c0 63 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ce for overflow 
2b2d0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61  dividers cells a
2b2e0 66 74 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a  fter balance */.
2b2f0 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b    u8 *aFrom = 0;
2b300 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2b310 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2b320 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2b330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2b340 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2b350 6d 75 74 65 78 29 20 29 3b 0a 20 20 56 56 41 5f  mutex) );.  VVA_
2b360 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
2b370 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b  sShuffled = 1 );
2b380 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e  ..  /* .  ** Fin
2b390 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  d the parent pag
2b3a0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2b3b0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
2b3c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2b3d0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2b3e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2b3f0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2b400 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2b410 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  || pPage->nOverf
2b420 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20  low==1 );.  pBt 
2b430 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2b440 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  pParent = pCur->
2b450 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b460 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge-1];.  assert(
2b470 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
2b480 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
2b490 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b4a0 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
2b4b0 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 67  bPage)) ){.    g
2b4c0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2b4d0 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43  nup;.  }..  TRAC
2b4e0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
2b4f0 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
2b500 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
2b510 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
2b520 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65  >pgno));..#ifnde
2b530 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
2b540 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a  ICKBALANCE.  /*.
2b550 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63    ** A special c
2b560 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65  ase:  If a new e
2b570 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65  ntry has just be
2b580 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
2b590 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74   a.  ** table (t
2b5a0 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20  hat is, a btree 
2b5b0 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79  with integer key
2b5c0 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61  s and all data a
2b5d0 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20  t the leaves).  
2b5e0 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65  ** and the new e
2b5f0 6e 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68  ntry is the righ
2b600 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20  t-most entry in 
2b610 74 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73  the tree (it has
2b620 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73   the.  ** larges
2b630 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20  t key) then use 
2b640 74 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61  the special bala
2b650 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74  nce_quick() rout
2b660 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c  ine for.  ** bal
2b670 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65  ancing.  balance
2b680 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68  _quick() is much
2b690 20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75   faster and resu
2b6a0 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72  lts in a tighter
2b6b0 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66  .  ** packing of
2b6c0 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d   data in the com
2b6d0 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  mon case..  */. 
2b6e0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2b6f0 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
2b700 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20  >intKey &&.     
2b710 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2b720 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50  w==1 &&.      pP
2b730 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  age->aOvfl[0].id
2b740 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x==pPage->nCell 
2b750 26 26 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  &&.      pParent
2b760 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20  ->pgno!=1 &&.   
2b770 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
2b780 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2b790 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2b7a0 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a  ])==pPage->pgno.
2b7b0 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
2b7c0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
2b7d0 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ;.    /*.    ** 
2b7e0 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20  TODO: Check the 
2b7f0 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20  siblings to the 
2b800 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49  left of pPage. I
2b810 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20  t may be that.  
2b820 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f    ** they are no
2b830 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65  t full and no ne
2b840 77 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  w page is requir
2b850 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
2b860 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75  eturn balance_qu
2b870 69 63 6b 28 70 43 75 72 29 3b 0a 20 20 7d 0a 23  ick(pCur);.  }.#
2b880 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c  endif..  if( SQL
2b890 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
2b8a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b8b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2b8c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c   ){.    goto bal
2b8d0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2b8e0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
2b8f0 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68  d the cell in th
2b900 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68  e parent page wh
2b910 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70  ose left child p
2b920 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20  oints back.  ** 
2b930 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22  to pPage.  The "
2b940 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73  idx" variable is
2b950 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2b960 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61  at cell.  If pPa
2b970 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72  ge.  ** is the r
2b980 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ightmost child o
2b990 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73  f pParent then s
2b9a0 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e  et idx to pParen
2b9b0 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20  t->nCell .  */. 
2b9c0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
2b9d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2b9e0 5d 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  ];.  assertParen
2b9f0 74 49 6e 64 65 78 28 70 50 61 72 65 6e 74 2c 20  tIndex(pParent, 
2ba00 69 64 78 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  idx, pPage->pgno
2ba10 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  );..  /*.  ** Fi
2ba20 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  nd sibling pages
2ba30 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68   to pPage and th
2ba40 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
2ba50 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20  nt that divide. 
2ba60 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73   ** the siblings
2ba70 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  .  An attempt is
2ba80 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
2ba90 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
2baa0 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66  her.  ** side of
2bab0 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69   pPage.  More si
2bac0 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
2bad0 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
2bae0 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a  however, if.  **
2baf0 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65   pPage there are
2bb00 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
2bb10 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
2bb20 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70  ther side.  If p
2bb30 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
2bb40 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
2bb50 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
2bb60 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
2bb70 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a  t are taken..  *
2bb80 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20  /.  nxDiv = idx 
2bb90 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69  - NN;.  if( nxDi
2bba0 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74  v + NB > pParent
2bbb0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e  ->nCell ){.    n
2bbc0 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e  xDiv = pParent->
2bbd0 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a  nCell - NB + 1;.
2bbe0 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c    }.  if( nxDiv<
2bbf0 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  0 ){.    nxDiv =
2bc00 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d   0;.  }.  nDiv =
2bc10 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b   0;.  for(i=0, k
2bc20 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b  =nxDiv; i<NB; i+
2bc30 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, k++){.    if(
2bc40 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   k<pParent->nCel
2bc50 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  l ){.      apDiv
2bc60 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
2bc70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20  Parent, k);.    
2bc80 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20    nDiv++;.      
2bc90 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74  assert( !pParent
2bca0 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  ->leaf );.      
2bcb0 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
2bcc0 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
2bcd0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
2bce0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
2bcf0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   ){.      pgnoOl
2bd00 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
2bd10 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2bd20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2bd30 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
2bd40 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
2bd50 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
2bd60 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
2bd70 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26  t, pgnoOld[i], &
2bd80 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
2bd90 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2bda0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2bdb0 20 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69    /* apOld[i]->i
2bdc0 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f  dxParent = k; */
2bdd0 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d  .    apCopy[i] =
2bde0 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2bdf0 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e  i==nOld );.    n
2be00 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43  Old++;.    nMaxC
2be10 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b  ells += 1+apOld[
2be20 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b  i]->nCell+apOld[
2be30 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  i]->nOverflow;. 
2be40 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d   }..  /* Make nM
2be50 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70  axCells a multip
2be60 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72  le of 4 in order
2be70 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62   to preserve 8-b
2be80 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65  yte.  ** alignme
2be90 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c  nt */.  nMaxCell
2bea0 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b  s = (nMaxCells +
2beb0 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20   3)&~3;..  /*.  
2bec0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
2bed0 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72  e for memory str
2bee0 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73  uctures.  */.  s
2bef0 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20  zScratch =.     
2bf00 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65    nMaxCells*size
2bf10 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20  of(u8*)         
2bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bf30 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
2bf40 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
2bf50 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20  of(u16)         
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bf70 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   szCell */.     
2bf80 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  + (ROUND8(sizeof
2bf90 28 4d 65 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e  (MemPage))+pBt->
2bfa0 70 61 67 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a  pageSize)*NB  /*
2bfb0 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b   aCopy */.     +
2bfc0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20   pBt->pageSize  
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bff0 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20  aSpace1 */.     
2c000 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20  + (ISAUTOVACUUM 
2c010 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29  ? nMaxCells : 0)
2c020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c030 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70 43 65   aFrom */.  apCe
2c040 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ll = sqlite3Scra
2c050 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72  tchMalloc( szScr
2c060 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61  atch ); .  if( a
2c070 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
2c080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2c090 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
2c0a0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2c0b0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
2c0c0 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
2c0d0 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d  lls];.  aCopy[0]
2c0e0 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
2c0f0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
2c100 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2c110 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 43 6f 70 79  _ALIGNMENT(aCopy
2c120 5b 30 5d 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  [0]) );.  for(i=
2c130 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20  1; i<NB; i++){. 
2c140 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61     aCopy[i] = &a
2c150 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70  Copy[i-1][pBt->p
2c160 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
2c170 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
2c180 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
2c190 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29  aCopy[i] - (u8*)
2c1a0 30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  0) & 7)==0 ); /*
2c1b0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
2c1c0 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
2c1d0 7d 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61  }.  aSpace1 = &a
2c1e0 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e  Copy[NB-1][pBt->
2c1f0 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28  pageSize+ROUND8(
2c200 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
2c210 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
2c220 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2c230 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 20 20  T(aSpace1) );.  
2c240 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2c250 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20   ){.    aFrom = 
2c260 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61  &aSpace1[pBt->pa
2c270 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61  geSize];.  }.  a
2c280 53 70 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33  Space2 = sqlite3
2c290 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e  PageMalloc(pBt->
2c2a0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28  pageSize);.  if(
2c2b0 20 61 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20   aSpace2==0 ){. 
2c2c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2c2d0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
2c2e0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2c2f0 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a    }.  .  /*.  **
2c300 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
2c310 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
2c320 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  Page and its sib
2c330 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b  lings into aOld[
2c340 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74  ]..  ** The rest
2c350 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2c360 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
2c370 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
2c380 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74  rather.  ** that
2c390 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
2c3a0 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
2c3b0 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
2c3c0 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  l be in the.  **
2c3d0 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
2c3e0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20  g overwritten.. 
2c3f0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2c400 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
2c410 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70   MemPage *p = ap
2c420 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
2c430 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20  ge*)aCopy[i];.  
2c440 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c    memcpy(p, apOl
2c450 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  d[i], sizeof(Mem
2c460 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61  Page));.    p->a
2c470 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70  Data = (void*)&p
2c480 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
2c490 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  p->aData, apOld[
2c4a0 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
2c4b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
2c4c0 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70    /*.  ** Load p
2c4d0 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63  ointers to all c
2c4e0 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20  ells on sibling 
2c4f0 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69  pages and the di
2c500 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
2c510 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
2c520 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20  apCell[] array. 
2c530 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
2c540 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2c550 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63  s.  ** into spac
2c560 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20  e obtained form 
2c570 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65  aSpace1[] and re
2c580 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76  move the the div
2c590 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20  ider Cells.  ** 
2c5a0 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
2c5b0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
2c5c0 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c  iblings are on l
2c5d0 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20  eaf pages, then 
2c5e0 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  the child pointe
2c5f0 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64  rs of the.  ** d
2c600 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65  ivider cells are
2c610 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74   stripped from t
2c620 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  he cells before 
2c630 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a  they are copied.
2c640 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65    ** into aSpace
2c650 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  1[].  In this wa
2c660 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
2c670 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
2c680 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
2c690 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
2c6a0 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
2c6b0 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
2c6c0 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
2c6d0 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
2c6e0 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
2c6f0 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
2c700 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2c710 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
2c720 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
2c730 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
2c740 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2c750 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
2c760 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
2c770 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
2c780 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
2c790 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
2c7a0 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
2c7b0 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
2c7c0 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65   nCell = 0;.  le
2c7d0 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70  afCorrection = p
2c7e0 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  Page->leaf*4;.  
2c7f0 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61 67 65  leafData = pPage
2c800 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
2c810 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
2c820 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
2c830 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
2c840 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ];.    int limit
2c850 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
2c860 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
2c870 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
2c880 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  imit; j++){.    
2c890 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
2c8a0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2c8b0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
2c8c0 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
2c8d0 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20  ell(pOld, j);.  
2c8e0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2c8f0 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2c900 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65  pOld, apCell[nCe
2c910 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ll]);.      if( 
2c920 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2c930 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20          int a;. 
2c940 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
2c950 6c 6c 5d 20 3d 20 28 75 38 29 69 3b 20 20 20 61  ll] = (u8)i;   a
2c960 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
2c970 3c 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  <6 );.        fo
2c980 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e  r(a=0; a<pOld->n
2c990 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a  Overflow; a++){.
2c9a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2c9b0 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65  ld->aOvfl[a].pCe
2c9c0 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ll==apCell[nCell
2c9d0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
2c9e0 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
2c9f0 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20  0xFF;.          
2ca00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2ca10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2ca20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65       }.      nCe
2ca30 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
2ca40 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a  if( i<nOld-1 ){.
2ca50 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63        u16 sz = c
2ca60 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
2ca70 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
2ca80 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
2ca90 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
2caa0 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41 54  With the LEAFDAT
2cab0 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20  A flag, pParent 
2cac0 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20  cells hold only 
2cad0 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20  INTKEYs that.   
2cae0 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c       ** are dupl
2caf0 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f  icates of keys o
2cb00 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
2cb10 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  s.  We need to r
2cb20 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a  emove.        **
2cb30 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2cb40 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c  ls from pParent,
2cb50 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65 72   but the divider
2cb60 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a  s cells are not.
2cb70 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
2cb80 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63   to apCell[] bec
2cb90 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64 75  ause they are du
2cba0 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c  plicates of chil
2cbb0 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20  d cells..       
2cbc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70   */.        drop
2cbd0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
2cbe0 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
2cbf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
2cc00 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
2cc10 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
2cc20 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2cc30 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2cc40 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  l] = sz;.       
2cc50 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
2cc60 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
2cc70 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73      iSpace1 += s
2cc80 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
2cc90 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
2cca0 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
2ccb0 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
2ccc0 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1<=pBt->pageSize
2ccd0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
2cce0 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
2ccf0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  i], sz);.       
2cd00 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
2cd10 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
2cd20 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
2cd30 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2cd40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72  ){.          aFr
2cd50 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
2cd60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2cd70 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2cd80 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
2cd90 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2cda0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2cdb0 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65  ==0 || leafCorre
2cdc0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
2cdd0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2cde0 5d 20 2d 3d 20 28 75 31 36 29 6c 65 61 66 43 6f  ] -= (u16)leafCo
2cdf0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2ce00 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
2ce10 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f  te(pTemp)==pgnoO
2ce20 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20  ld[i] );.       
2ce30 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
2ce40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
2ce50 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
2ce60 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  tion==0 );.     
2ce70 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2ce80 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
2ce90 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
2cea0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
2ceb0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
2cec0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
2ced0 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
2cee0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
2cef0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70  pCell[nCell], &p
2cf00 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d  Old->aData[pOld-
2cf10 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34  >hdrOffset+8], 4
2cf20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2cf30 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2cf40 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
2cf50 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
2cf60 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
2cf70 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
2cf80 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2cf90 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20  allow any cells 
2cfa0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62  smaller than 4 b
2cfb0 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ytes. */.       
2cfc0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2cfd0 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l] = 4;.        
2cfe0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2cff0 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
2d000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d010 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75  ..  /*.  ** Figu
2d020 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65  re out the numbe
2d030 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65  r of pages neede
2d040 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43  d to hold all nC
2d050 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20  ell cells..  ** 
2d060 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65  Store this numbe
2d070 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20  r in "k".  Also 
2d080 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20  compute szNew[] 
2d090 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74  which is the tot
2d0a0 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  al.  ** size of 
2d0b0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  all cells on the
2d0c0 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63   i-th page and c
2d0d0 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  ntNew[] which is
2d0e0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
2d0f0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74  in apCell[] of t
2d100 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76  he cell that div
2d110 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d  ides page i from
2d120 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a   page i+1.  .  *
2d130 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75  * cntNew[k] shou
2d140 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a  ld equal nCell..
2d150 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73    **.  ** Values
2d160 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69   computed by thi
2d170 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20  s block:.  **.  
2d180 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20  **           k: 
2d190 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  The total number
2d1a0 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65   of sibling page
2d1b0 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b  s.  **    szNew[
2d1c0 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20  i]: Spaced used 
2d1d0 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  on the i-th sibl
2d1e0 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20  ing page..  **  
2d1f0 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65   cntNew[i]: Inde
2d200 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  x in apCell[] an
2d210 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74  d szCell[] for t
2d220 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  he first cell to
2d230 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2d240 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20     the right of 
2d250 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
2d260 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62   page..  ** usab
2d270 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20  leSpace: Number 
2d280 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2d290 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65  e available on e
2d2a0 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a  ach sibling..  *
2d2b0 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65  * .  */.  usable
2d2c0 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61  Space = pBt->usa
2d2d0 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c  bleSize - 12 + l
2d2e0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
2d2f0 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d   for(subtotal=k=
2d300 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
2d310 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2d320 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  i<nMaxCells );. 
2d330 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73     subtotal += s
2d340 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20  zCell[i] + 2;.  
2d350 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e    if( subtotal >
2d360 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a   usableSpace ){.
2d370 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d        szNew[k] =
2d380 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65   subtotal - szCe
2d390 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74  ll[i];.      cnt
2d3a0 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20  New[k] = i;.    
2d3b0 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
2d3c0 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73  { i--; }.      s
2d3d0 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20  ubtotal = 0;.   
2d3e0 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     k++;.    }.  
2d3f0 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73  }.  szNew[k] = s
2d400 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65  ubtotal;.  cntNe
2d410 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20  w[k] = nCell;.  
2d420 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  k++;..  /*.  ** 
2d430 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70  The packing comp
2d440 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  uted by the prev
2d450 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69  ious block is bi
2d460 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20  ased toward the 
2d470 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e  siblings.  ** on
2d480 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20   the left side. 
2d490 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e   The left siblin
2d4a0 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65  gs are always ne
2d4b0 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65  arly full, while
2d4c0 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d   the.  ** right-
2d4d0 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67  most sibling mig
2d4e0 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70  ht be nearly emp
2d4f0 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20  ty.  This block 
2d500 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73  of code attempts
2d510 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20  .  ** to adjust 
2d520 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73  the packing of s
2d530 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61  iblings to get a
2d540 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e   better balance.
2d550 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2d560 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f  adjustment is mo
2d570 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d  re than an optim
2d580 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61  ization.  The pa
2d590 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68  cking above migh
2d5a0 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74  t.  ** be so out
2d5b0 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74   of balance as t
2d5c0 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46  o be illegal.  F
2d5d0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
2d5e0 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
2d5f0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
2d600 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
2d610 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d  y.  This adjustm
2d620 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f  ent is not optio
2d630 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nal..  */.  for(
2d640 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  i=k-1; i>0; i--)
2d650 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68  {.    int szRigh
2d660 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f  t = szNew[i];  /
2d670 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
2d680 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  g on the right *
2d690 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74  /.    int szLeft
2d6a0 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f   = szNew[i-1]; /
2d6b0 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
2d6c0 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  g on the left */
2d6d0 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20  .    int r;     
2d6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2d6f0 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20  x of right-most 
2d700 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62  cell in left sib
2d710 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ling */.    int 
2d720 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2d730 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
2d740 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65  t cell to the le
2d750 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c  ft of right sibl
2d760 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20  ing */..    r = 
2d770 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
2d780 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d  .    d = r + 1 -
2d790 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61   leafData;.    a
2d7a0 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c  ssert( d<nMaxCel
2d7b0 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ls );.    assert
2d7c0 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( r<nMaxCells );
2d7d0 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69  .    while( szRi
2d7e0 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68  ght==0 || szRigh
2d7f0 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73  t+szCell[d]+2<=s
2d800 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d  zLeft-(szCell[r]
2d810 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52  +2) ){.      szR
2d820 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64  ight += szCell[d
2d830 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c  ] + 2;.      szL
2d840 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d  eft -= szCell[r]
2d850 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e   + 2;.      cntN
2d860 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20  ew[i-1]--;.     
2d870 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
2d880 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20   - 1;.      d = 
2d890 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
2d8a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65  ;.    }.    szNe
2d8b0 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a  w[i] = szRight;.
2d8c0 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d      szNew[i-1] =
2d8d0 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20   szLeft;.  }..  
2d8e0 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75  /* Either we fou
2d8f0 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  nd one or more c
2d900 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29  ells (cntnew[0])
2d910 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a  >0) or pPage is.
2d920 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
2d930 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
2d940 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
2d950 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
2d960 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
2d970 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
2d980 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
2d990 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
2d9a0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2d9b0 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
2d9c0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
2d9d0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
2d9e0 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
2d9f0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
2da00 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
2da10 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
2da20 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
2da30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2da40 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
2da50 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
2da60 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
2da70 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
2da80 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
2da90 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
2daa0 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
2dab0 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
2dac0 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
2dad0 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
2dae0 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
2daf0 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
2db00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2db10 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
2db20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
2db30 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
2db40 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2db50 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
2db60 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2db70 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
2db80 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2db90 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
2dba0 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c  ew, &pgnoNew[i],
2dbb0 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30   pgnoNew[i-1], 0
2dbc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2dbd0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2dbe0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
2dbf0 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
2dc00 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
2dc10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
2dc20 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
2dc30 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
2dc40 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
2dc50 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
2dc60 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
2dc70 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
2dc80 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
2dc90 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2dca0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
2dcb0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
2dcc0 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
2dcd0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
2dce0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2dcf0 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
2dd00 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
2dd10 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
2dd20 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
2dd30 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
2dd40 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
2dd50 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
2dd60 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
2dd70 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
2dd80 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
2dd90 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
2dda0 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
2ddb0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2ddc0 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
2ddd0 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
2dde0 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
2ddf0 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
2de00 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
2de10 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
2de20 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
2de30 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
2de40 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
2de50 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
2de60 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
2de70 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
2de80 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
2de90 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
2dea0 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
2deb0 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
2dec0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
2ded0 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
2dee0 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
2def0 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
2df00 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2df10 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
2df20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
2df30 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
2df40 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
2df50 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
2df60 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
2df70 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
2df80 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
2df90 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
2dfa0 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
2dfb0 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
2dfc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2dfd0 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
2dfe0 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
2dff0 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
2e000 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
2e010 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
2e020 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
2e030 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
2e040 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
2e050 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
2e060 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
2e070 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
2e080 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
2e090 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
2e0a0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2e0b0 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
2e0c0 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
2e0d0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
2e0e0 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
2e0f0 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
2e100 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
2e110 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
2e120 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
2e130 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
2e140 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
2e150 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
2e160 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
2e170 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
2e180 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
2e190 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
2e1a0 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
2e1b0 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
2e1c0 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
2e1d0 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
2e1e0 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
2e1f0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
2e200 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
2e210 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
2e220 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
2e230 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
2e240 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
2e250 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
2e260 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
2e270 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
2e280 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
2e290 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
2e2a0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
2e2b0 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
2e2c0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
2e2d0 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
2e2e0 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
2e2f0 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
2e300 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
2e310 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
2e320 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
2e330 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
2e340 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e   pNew->pgno==pgn
2e350 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a  oNew[i] );.    z
2e360 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
2e370 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
2e380 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
2e390 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
2e3a0 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
2e3b0 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
2e3c0 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
2e3d0 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
2e3e0 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
2e3f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2e400 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
2e410 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2e420 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2e430 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2e440 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2e450 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
2e460 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
2e470 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
2e480 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
2e490 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
2e4a0 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
2e4b0 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
2e4c0 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
2e4d0 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
2e4e0 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
2e4f0 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
2e500 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
2e510 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2e520 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2e530 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e     for(k=j; k<cn
2e540 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20  tNew[i]; k++){. 
2e550 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b         assert( k
2e560 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2e570 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b        if( aFrom[
2e580 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  k]==0xFF || apCo
2e590 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67  py[aFrom[k]]->pg
2e5a0 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
2e5b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2e5c0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2e5d0 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20  New, k-j);.     
2e5e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2e5f0 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 6f  ITE_OK && leafCo
2e600 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20  rrection==0 ){. 
2e610 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e620 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
2e630 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 6b  et4byte(apCell[k
2e640 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
2e650 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20  , pNew->pgno);. 
2e660 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e670 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2e680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e690 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2e6a0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2e6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e6c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2e6d0 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
2e6e0 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
2e6f0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
2e700 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
2e710 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
2e720 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
2e730 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
2e740 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
2e750 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2e760 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2e770 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c  ( i<nNew-1 && j<
2e780 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
2e790 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
2e7a0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
2e7b0 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
2e7c0 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
2e7d0 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
2e7e0 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
2e7f0 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
2e800 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
2e810 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
2e820 6d 70 20 3d 20 26 61 53 70 61 63 65 32 5b 69 53  mp = &aSpace2[iS
2e830 70 61 63 65 32 5d 3b 0a 20 20 20 20 20 20 69 66  pace2];.      if
2e840 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
2e850 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2e860 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
2e870 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
2e880 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2e890 43 55 55 4d 20 0a 20 20 20 20 20 20 20 20 20 26  CUUM .         &
2e8a0 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46  & (aFrom[j]==0xF
2e8b0 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
2e8c0 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[j]]->pgno!=pNe
2e8d0 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20 20  w->pgno).       
2e8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2e8f0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2e900 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
2e910 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
2e920 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
2e930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2e940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e950 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2e960 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2e970 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e980 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2e990 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2e9a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2e9b0 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
2e9c0 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
2e9d0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2e9e0 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
2e9f0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
2ea00 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
2ea10 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
2ea20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
2ea30 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
2ea40 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
2ea50 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
2ea60 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
2ea70 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
2ea80 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
2ea90 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
2eaa0 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
2eab0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2eac0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
2ead0 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
2eae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2eaf0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2eb00 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
2eb10 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
2eb20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
2eb30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 69  .        rc = fi
2eb40 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
2eb50 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  , pCell, 0, info
2eb60 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
2eb70 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &sz);.        if
2eb80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2eb90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2eba0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2ebb0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2ebc0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
2ebd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ebe0 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
2ebf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
2ec00 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
2ec10 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
2ec20 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
2ec30 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
2ec40 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
2ec50 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
2ec60 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
2ec70 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
2ec80 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
2ec90 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
2eca0 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
2ecb0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
2ecc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
2ecd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
2ece0 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
2ecf0 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
2ed00 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
2ed10 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
2ed20 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
2ed30 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
2ed40 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
2ed50 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
2ed60 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
2ed70 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
2ed80 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
2ed90 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
2eda0 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
2edb0 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
2edc0 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
2edd0 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
2ede0 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
2edf0 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
2ee00 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
2ee10 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
2ee20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
2ee30 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
2ee40 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
2ee50 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
2ee60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ee70 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
2ee80 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
2ee90 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
2eea0 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
2eeb0 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
2eec0 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
2eed0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
2eee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2eef0 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20  Space2 += sz;.  
2ef00 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
2ef10 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
2ef20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ef30 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70   iSpace2<=pBt->p
2ef40 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
2ef50 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2ef60 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2ef70 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
2ef80 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 4);.      if(
2ef90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2efa0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2efb0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
2efc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2efd0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2efe0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2eff0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2f000 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
2f010 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
2f020 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a  , pNew->pgno);..
2f030 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
2f040 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2f050 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  um database, and
2f060 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61   not a leaf-data
2f070 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20   tree,.      ** 
2f080 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20  then update the 
2f090 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68  pointer map with
2f0a0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
2f0b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  e overflow page.
2f0c0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
2f0d0 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65  e cell just inse
2f0e0 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28  rted points to (
2f0f0 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
2f100 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
2f110 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65 61  TOVACUUM && !lea
2f120 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
2f130 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
2f140 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  vfl(pParent, nxD
2f150 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  iv);.        if(
2f160 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f170 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2f180 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2f190 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f1a0 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20    }.      j++;. 
2f1b0 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
2f1c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
2f1d0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2f1e0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
2f1f0 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
2f200 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2f210 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2f220 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2f230 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  pBt, pNew->pgno,
2f240 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2f250 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
2f260 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f280 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2f290 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
2f2a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
2f2b0 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
2f2c0 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
2f2d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
2f2e0 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
2f2f0 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
2f300 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
2f310 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
2f320 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
2f330 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
2f340 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
2f350 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
2f360 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20  ld, 4);.    if( 
2f370 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2f380 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2f390 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
2f3a0 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d  te(zChild), PTRM
2f3b0 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
2f3c0 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a  nNew-1]->pgno);.
2f3d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f3e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f3f0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2f400 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2f410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2f420 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2f430 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2f440 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2f450 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70  ;.  if( nxDiv==p
2f460 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50  Parent->nCell+pP
2f470 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2f480 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74   ){.    /* Right
2f490 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
2f4a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2f4b0 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
2f4c0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2f4d0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2f4e0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2f4f0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b  set+8], pgnoNew[
2f500 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73  nNew-1]);.  }els
2f510 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d  e{.    /* Right-
2f520 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20  most sibling is 
2f530 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f  the left child o
2f540 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  f the first entr
2f550 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20  y in pParent.   
2f560 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69 67   ** past the rig
2f570 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20  ht-most divider 
2f580 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74  entry */.    put
2f590 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2f5a0 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  owCell(pParent, 
2f5b0 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b  nxDiv), pgnoNew[
2f5c0 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20  nNew-1]);.  }.. 
2f5d0 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
2f5e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2f5f0 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
2f600 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
2f610 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
2f620 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
2f630 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2f640 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
2f650 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
2f660 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
2f670 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2f680 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
2f690 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
2f6a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2f6b0 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
2f6c0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
2f6d0 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70  ee(apCell);.  ap
2f6e0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 54 52 41 43  Cell = 0;.  TRAC
2f6f0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
2f700 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
2f710 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
2f720 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
2f730 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
2f740 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
2f750 6c 6c 29 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ll));.  pPage->n
2f760 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
2f770 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2f780 65 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  e);.  pCur->iPag
2f790 65 2d 2d 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61  e--;.  rc = bala
2f7a0 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  nce(pCur, 0);.  
2f7b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
2f7c0 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
2f7d0 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
2f7e0 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
2f7f0 69 74 65 33 50 61 67 65 46 72 65 65 28 61 53 70  ite3PageFree(aSp
2f800 61 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  ace2);.  sqlite3
2f810 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
2f820 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
2f830 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
2f840 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
2f850 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
2f860 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
2f870 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
2f880 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
2f890 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 70 50  .  }.  pCur->apP
2f8a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2f8b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
2f8c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2f8d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2f8e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
2f8f0 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
2f900 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e   of a btree when
2f910 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2f920 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
2f930 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e  lls.  This is an
2f940 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
2f950 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a  make the tree.**
2f960 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e   shallower by on
2f970 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  e level..*/.stat
2f980 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73  ic int balance_s
2f990 68 61 6c 6c 6f 77 65 72 28 42 74 43 75 72 73 6f  hallower(BtCurso
2f9a0 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2f9b0 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
2f9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
2f9d0 20 70 61 67 65 20 6f 66 20 42 2d 54 72 65 65 20   page of B-Tree 
2f9e0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
2f9f0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2fa00 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68    /* The only ch
2fa10 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67  ild page of pPag
2fa20 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2fa30 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
2fa40 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2fa50 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f  er for pChild */
2fa60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2fa70 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2fa80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
2fa90 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
2faa0 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  s */.  BtShared 
2fab0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
2fac0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2fad0 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75  in BTree structu
2fae0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65  re */.  int mxCe
2faf0 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20  llPerPage;      
2fb00 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2fb10 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2fb20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  per page */.  u8
2fb30 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20   **apCell;      
2fb40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2fb50 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67  l cells from pag
2fb60 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
2fb70 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
2fb80 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2fb90 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
2fba0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
2fbb0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  /..  assert( pCu
2fbc0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20  r->iPage==0 );. 
2fbd0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2fbe0 70 50 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73 73  pPage[0];..  ass
2fbf0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2fc00 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2fc10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2fc20 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2fc30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74  >mutex) );.  pBt
2fc40 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2fc50 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d   mxCellPerPage =
2fc60 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20   MX_CELL(pBt);. 
2fc70 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
2fc80 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50  3Malloc( mxCellP
2fc90 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
2fca0 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29  8*)+sizeof(u16))
2fcb0 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
2fcc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2fcd0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
2fce0 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
2fcf0 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
2fd00 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
2fd10 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
2fd20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
2fd30 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
2fd40 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
2fd50 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
2fd60 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
2fd70 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
2fd80 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
2fd90 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
2fda0 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
2fdb0 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
2fdc0 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2fdd0 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
2fde0 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
2fdf0 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
2fe00 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
2fe10 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
2fe20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
2fe30 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
2fe40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2fe50 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2fe60 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
2fe70 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
2fe80 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
2fe90 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
2fea0 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
2feb0 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
2fec0 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2fed0 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
2fee0 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
2fef0 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
2ff00 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
2ff10 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
2ff20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
2ff30 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
2ff40 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
2ff50 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
2ff60 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
2ff70 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
2ff80 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
2ff90 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
2ffa0 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
2ffb0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
2ffc0 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
2ffd0 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
2ffe0 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
2fff0 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
30000 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
30010 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 56  ee..    */.    V
30020 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70  VA_ONLY( pCur->p
30030 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31  agesShuffled = 1
30040 20 29 3b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   );.    pgnoChil
30050 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
30060 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
30070 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
30080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
30090 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20  oChild>0 );.    
300a0 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
300b0 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  d<=pagerPagecoun
300c0 74 28 70 50 61 67 65 2d 3e 70 42 74 29 20 29 3b  t(pPage->pBt) );
300d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
300e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50  3BtreeGetPage(pP
300f0 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68  age->pBt, pgnoCh
30100 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29  ild, &pChild, 0)
30110 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
30120 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
30130 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28  balance;.    if(
30140 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
30150 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
30160 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
30170 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
30180 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30190 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
301a0 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
301b0 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
301c0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
301d0 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
301e0 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
301f0 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
30200 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
30210 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
30220 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
30230 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
30240 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
30250 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
30260 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
30270 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
30280 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
30290 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
302a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
302b0 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
302c0 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
302d0 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
302e0 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
302f0 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
30300 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
30310 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
30320 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
30330 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
30340 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
30350 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
30360 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
30370 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
30380 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
30390 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
303a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
303b0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
303c0 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
303d0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
303e0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
303f0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20  rOffset+8], .   
30400 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
30410 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e(&pChild->aData
30420 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73  [pChild->hdrOffs
30430 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20  et+8]));.       
30440 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
30450 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
30460 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
30470 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
30480 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
30490 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
304a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
304b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
304c0 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
304d0 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
304e0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
304f0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
30500 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
30510 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
30520 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
30530 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
30540 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
30550 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
30560 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
30570 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
30580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30590 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
305a0 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
305b0 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
305c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
305d0 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
305e0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  it = 0;.      rc
305f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
30600 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
30610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
30620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
30630 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43       freePage(pC
30640 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41  hild);.      TRA
30650 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72  CE(("BALANCE: tr
30660 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64 20  ansfer child %d 
30670 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c  into root %d\n",
30680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
30690 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61  Child->pgno, pPa
306a0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
306b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
306c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
306d0 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
306e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
306f0 55 55 4d 0a 20 20 20 20 69 66 28 20 49 53 41 55  UUM.    if( ISAU
30700 54 4f 56 41 43 55 55 4d 20 26 26 20 72 63 3d 3d  TOVACUUM && rc==
30710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30720 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
30730 50 74 72 6d 61 70 73 28 70 50 61 67 65 29 3b 0a  Ptrmaps(pPage);.
30740 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30750 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
30760 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68  ild);.  }.end_sh
30770 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20  allow_balance:. 
30780 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70   sqlite3_free(ap
30790 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
307a0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
307b0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f  e root page is o
307c0 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68  verfull.**.** Wh
307d0 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  en this happens,
307e0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68   Create a new ch
307f0 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70  ild page and cop
30800 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  y the.** content
30810 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e  s of the root in
30820 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54  to the child.  T
30830 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f  hen make the roo
30840 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70  t.** page an emp
30850 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67  ty page with rig
30860 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67  htChild pointing
30870 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63   to the new.** c
30880 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c  hild.   Finally,
30890 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e   call balance_in
308a0 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20  ternal() on the 
308b0 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20  new child.** to 
308c0 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69  cause it to spli
308d0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
308e0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
308f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
30900 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
30910 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30920 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
30930 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
30940 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
30950 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
30960 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 2a   the root page *
30970 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
30980 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ild;    /* Point
30990 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
309a0 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
309b0 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
309c0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
309d0 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  f the new child 
309e0 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  page */.  BtShar
309f0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
30a00 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
30a10 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
30a20 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
30a30 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61  usable size of a
30a40 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64   page */.  u8 *d
30a50 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
30a60 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
30a70 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a   parent page */.
30a80 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20    u8 *cdata;    
30a90 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
30aa0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
30ab0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ge */.  int hdr;
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30ad0 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68 65  ffset to page he
30ae0 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a  ader in parent *
30af0 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
30b00 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
30b10 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t to content of 
30b20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61  first cell in pa
30b30 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rent */..  asser
30b40 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  t( pCur->iPage==
30b50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
30b60 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
30b70 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a  nOverflow>0 );..
30b80 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
30b90 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
30ba0 3d 20 31 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  = 1 );.  pPage =
30bb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
30bc0 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
30bd0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
30be0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
30bf0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
30c00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
30c10 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30c20 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
30c30 67 65 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c  ge) );.  rc = al
30c40 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
30c50 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70  pBt, &pChild, &p
30c60 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d  gnoChild, pPage-
30c70 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28  >pgno, 0);.  if(
30c80 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30c90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30ca0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
30cb0 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
30cc0 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ge) );.  usableS
30cd0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
30ce0 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20  eSize;.  data = 
30cf0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
30d00 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
30d10 4f 66 66 73 65 74 3b 0a 20 20 63 62 72 6b 20 3d  Offset;.  cbrk =
30d20 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
30d30 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61  hdr+5]);.  cdata
30d40 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61   = pChild->aData
30d50 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61  ;.  memcpy(cdata
30d60 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50  , &data[hdr], pP
30d70 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  age->cellOffset+
30d80 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68  2*pPage->nCell-h
30d90 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63  dr);.  memcpy(&c
30da0 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74  data[cbrk], &dat
30db0 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  a[cbrk], usableS
30dc0 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a 20 20 61 73  ize-cbrk);..  as
30dd0 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73  sert( pChild->is
30de0 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20  Init==0 );.  rc 
30df0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
30e00 69 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  itPage(pChild);.
30e10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
30e30 43 6f 70 79 20 3d 20 70 50 61 67 65 2d 3e 6e 4f  Copy = pPage->nO
30e40 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
30e50 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 3b  Page->aOvfl[0]);
30e60 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 68 69  .    memcpy(pChi
30e70 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
30e80 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f 70 79 29 3b  ->aOvfl, nCopy);
30e90 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  .    pChild->nOv
30ea0 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e  erflow = pPage->
30eb0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
30ec0 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  f( pChild->nOver
30ed0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 43  flow ){.      pC
30ee0 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  hild->nFree = 0;
30ef0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
30f00 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
30f10 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
30f20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
30f30 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30f40 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
30f50 50 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72  Page) );.    zer
30f60 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
30f70 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
30f80 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  ~PTF_LEAF);.    
30f90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
30fa0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
30fb0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
30fc0 43 68 69 6c 64 29 3b 0a 20 20 20 20 54 52 41 43  Child);.    TRAC
30fd0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70  E(("BALANCE: cop
30fe0 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25  y root %d into %
30ff0 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
31000 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  o, pChild->pgno)
31010 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  );.    if( ISAUT
31020 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
31030 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
31040 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  pBt, pChild->pgn
31050 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
31060 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23   pPage->pgno);.#
31070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31080 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31090 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
310a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
310b0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
310c0 72 6d 61 70 73 28 70 43 68 69 6c 64 29 3b 0a 20  rmaps(pChild);. 
310d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
310e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
310f0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
31100 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
31110 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
31120 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31130 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
31140 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 20 20 70 43  >iPage++;.    pC
31150 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 20 3d 20  ur->apPage[1] = 
31160 70 43 68 69 6c 64 3b 0a 20 20 20 20 70 43 75 72  pChild;.    pCur
31170 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
31180 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
31190 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a  _nonroot(pCur);.
311a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
311b0 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
311c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
311d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
311e0 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20   page that pCur 
311f0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
31200 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65   to has just bee
31210 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a  n modified in.**
31220 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20   some way. This 
31230 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73  function figures
31240 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64   out if this mod
31250 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20  ification means 
31260 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64  the.** tree need
31270 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
31280 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c  , and if so call
31290 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  s the appropriat
312a0 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20  e balancing .** 
312b0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
312c0 50 61 72 61 6d 65 74 65 72 20 69 73 49 6e 73 65  Parameter isInse
312d0 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 20  rt is true if a 
312e0 6e 65 77 20 63 65 6c 6c 20 77 61 73 20 6a 75 73  new cell was jus
312f0 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  t inserted into 
31300 74 68 65 0a 2a 2a 20 70 61 67 65 2c 20 6f 72 20  the.** page, or 
31310 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
31320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
31330 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20  alance(BtCursor 
31340 2a 70 43 75 72 2c 20 69 6e 74 20 69 73 49 6e 73  *pCur, int isIns
31350 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ert){.  int rc =
31360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
31370 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
31380 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
31390 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20 20 61 73 73  ->iPage];..  ass
313a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
313b0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
313c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
313d0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
313e0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
313f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31400 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31410 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
31420 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
31430 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
31440 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
31450 6e 63 65 5f 64 65 65 70 65 72 28 70 43 75 72 29  nce_deeper(pCur)
31460 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31470 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d  pCur->apPage[0]=
31480 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =pPage );.      
31490 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
314a0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72  Overflow==0 || r
314b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
314c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
314d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
314e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
314f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
31500 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70  ance_shallower(p
31510 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Cur);.      asse
31520 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
31530 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20  [0]==pPage );.  
31540 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31550 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
31560 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
31570 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
31580 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
31590 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
315a0 20 0a 20 20 20 20 20 20 20 20 28 21 69 73 49 6e   .        (!isIn
315b0 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e  sert && pPage->n
315c0 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d  Free>pPage->pBt-
315d0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
315e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
315f0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
31600 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
31610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31620 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
31630 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
31640 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
31650 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
31660 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
31670 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
31680 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
31690 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
316a0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
316b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
316c0 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
316d0 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
316e0 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
316f0 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
31700 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
31710 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
31720 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
31730 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
31740 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
31750 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
31760 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
31770 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
31780 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c  ED..**.** As wel
31790 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69 74  l as cursors wit
317a0 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72  h wrFlag==0, cur
317b0 73 6f 72 73 20 77 69 74 68 20 0a 2a 2a 20 69 73  sors with .** is
317c0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d  IncrblobHandle==
317d0 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69  1 are also consi
317e0 64 65 72 65 64 20 27 72 65 61 64 27 20 63 75 72  dered 'read' cur
317f0 73 6f 72 73 20 62 65 63 61 75 73 65 0a 2a 2a 20  sors because.** 
31800 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
31810 20 63 75 72 73 6f 72 73 20 61 72 65 20 75 73 65   cursors are use
31820 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  d for both readi
31830 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a  ng and writing..
31840 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52  **.** When pgnoR
31850 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20  oot is the root 
31860 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65  page of an intke
31870 79 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66 75  y table, this fu
31880 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a  nction is also.*
31890 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  * responsible fo
318a0 72 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 69  r invalidating i
318b0 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
318c0 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68 65  cursors when the
318d0 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e   table row.** on
318e0 20 77 68 69 63 68 20 74 68 65 79 20 61 72 65 20   which they are 
318f0 6f 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74 65  opened is delete
31900 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20 43  d or modified. C
31910 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
31920 69 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  idated.** accord
31930 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ing to the follo
31940 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  wing rules:.**.*
31950 2a 20 20 20 31 29 20 57 68 65 6e 20 42 74 72 65  *   1) When Btre
31960 65 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69 73  eClearTable() is
31970 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
31980 65 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68 65  etely delete the
31990 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20   contents.**    
319a0 20 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74 61    of a B-Tree ta
319b0 62 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69 73  ble, pExclude is
319c0 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64   set to zero and
319d0 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20   parameter iRow 
319e0 69 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74 20  is .**      set 
319f0 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  to non-zero. In 
31a00 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69 6e  this case all in
31a10 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
31a20 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20  ursors open.**  
31a30 20 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65      on the table
31a40 20 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f 52   rooted at pgnoR
31a50 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64 61  oot are invalida
31a60 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  ted..**.**   2) 
31a70 57 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72 74  When BtreeInsert
31a80 28 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65 28  (), BtreeDelete(
31a90 29 20 6f 72 20 42 74 72 65 65 50 75 74 44 61 74  ) or BtreePutDat
31aa0 61 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  a() is called to
31ab0 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66 79   .**      modify
31ac0 20 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69 61   a table row via
31ad0 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
31ae0 74 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73  t, pExclude is s
31af0 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20  et to the .**   
31b00 20 20 20 77 72 69 74 65 20 63 75 72 73 6f 72 20     write cursor 
31b10 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20 6d  used to do the m
31b20 6f 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20  odification and 
31b30 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69  parameter iRow i
31b40 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f  s set.**      to
31b50 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f 77   the integer row
31b60 20 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72 65   id of the B-Tre
31b70 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f  e entry being mo
31b80 64 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a  dified. Unless.*
31b90 2a 20 20 20 20 20 20 70 45 78 63 6c 75 64 65 20  *      pExclude 
31ba0 69 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e 63  is itself an inc
31bb0 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
31bc0 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69  rsor, then all i
31bd0 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20  ncremental.**   
31be0 20 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20     blob cursors 
31bf0 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77  open on row iRow
31c00 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61   of the B-Tree a
31c10 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  re invalidated..
31c20 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62 6f  **.**   3) If bo
31c30 74 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64 20  th pExclude and 
31c40 69 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f 20  iRow are set to 
31c50 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65  zero, no increme
31c60 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20  ntal blob .**   
31c70 20 20 20 63 75 72 73 6f 72 73 20 61 72 65 20 69     cursors are i
31c80 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
31c90 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46  tatic int checkF
31ca0 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  orReadConflicts(
31cb0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
31cc0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
31cd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31ce0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67  to check */.  Pg
31cf0 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20  no pgnoRoot,    
31d00 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f        /* Look fo
31d10 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  r read cursors o
31d20 6e 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  n this btree */.
31d30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63    BtCursor *pExc
31d40 6c 75 64 65 2c 20 20 20 20 20 2f 2a 20 49 67 6e  lude,     /* Ign
31d50 6f 72 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ore this cursor 
31d60 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 20 20 20  */.  i64 iRow   
31d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31d80 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
31d90 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
31da0 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
31db0 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
31dc0 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
31dd0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
31de0 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b  db = pBtree->db;
31df0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31e00 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
31e10 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66  x(pBtree) );.  f
31e20 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
31e30 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
31e40 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45  ){.    if( p==pE
31e50 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75  xclude ) continu
31e60 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67  e;.    if( p->pg
31e70 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74  noRoot!=pgnoRoot
31e80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
31e90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31ea0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66  _INCRBLOB.    if
31eb0 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
31ec0 61 6e 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20  andle && ( .    
31ed0 20 20 20 20 20 28 21 70 45 78 63 6c 75 64 65 20       (!pExclude 
31ee0 26 26 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c  && iRow).      |
31ef0 7c 20 28 70 45 78 63 6c 75 64 65 20 26 26 20 21  | (pExclude && !
31f00 70 45 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72  pExclude->isIncr
31f10 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d  blobHandle && p-
31f20 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
31f30 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20  ).    )){.      
31f40 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
31f50 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
31f60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
31f70 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53   p->eState!=CURS
31f80 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69  OR_VALID ) conti
31f90 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
31fa0 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64  wrFlag==0 .#ifnd
31fb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
31fc0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20  NCRBLOB.     || 
31fd0 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
31fe0 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  dle.#endif.    )
31ff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
32000 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42  *dbOther = p->pB
32010 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
32020 61 73 73 65 72 74 28 64 62 4f 74 68 65 72 29 3b  assert(dbOther);
32030 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68  .      if( dbOth
32040 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68  er!=db && (dbOth
32050 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  er->flags & SQLI
32060 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
32070 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed)==0 ){.      
32080 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
32090 69 6f 6e 42 6c 6f 63 6b 65 64 28 64 62 2c 20 64  ionBlocked(db, d
320a0 62 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20  bOther);.       
320b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
320c0 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
320d0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
320e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
320f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
32100 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
32110 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42  ecord into the B
32120 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69  Tree.  The key i
32130 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79  s given by (pKey
32140 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68  ,nKey).** and th
32150 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20  e data is given 
32160 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29  by (pData,nData)
32170 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  .  The cursor is
32180 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a   used only to.**
32190 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62   define what tab
321a0 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68  le the record sh
321b0 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
321c0 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73   into.  The curs
321d0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
321e0 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
321f0 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  om location..**.
32200 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59  ** For an INTKEY
32210 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65   table, only the
32220 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74   nKey value of t
32230 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20  he key is used. 
32240 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f   pKey is.** igno
32250 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f  red.  For a ZERO
32260 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20  DATA table, the 
32270 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20  pData and nData 
32280 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64  are both ignored
32290 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
322a0 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
322b0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
322c0 20 74 68 65 6e 20 61 20 73 75 63 63 65 73 73 66   then a successf
322d0 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71  ul call to.** sq
322e0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
322f0 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f  () to seek curso
32300 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c  r pCur to (pKey,
32310 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61   nKey) has alrea
32320 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f  dy.** been perfo
32330 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74  rmed. seekResult
32340 20 69 73 20 74 68 65 20 73 65 61 72 63 68 20 72   is the search r
32350 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28  esult returned (
32360 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75  a negative.** nu
32370 6d 62 65 72 20 69 66 20 70 43 75 72 20 70 6f 69  mber if pCur poi
32380 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20  nts at an entry 
32390 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  that is smaller 
323a0 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79  than (pKey, nKey
323b0 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74  ), or.** a posit
323c0 69 76 65 20 76 61 6c 75 65 20 69 66 20 70 43 75  ive value if pCu
323d0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65  r points at an e
323e0 74 72 79 20 74 68 61 74 20 69 73 20 6c 61 72 67  try that is larg
323f0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65  er than .** (pKe
32400 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a  y, nKey)). .**.*
32410 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
32420 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
32430 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20   0, then cursor 
32440 70 43 75 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  pCur may point t
32450 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74 72 79 20  o any .** entry 
32460 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61  or to no entry a
32470 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63  t all. In this c
32480 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
32490 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a  n has to seek.**
324a0 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f   the cursor befo
324b0 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63  re the new key c
324c0 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  an be inserted..
324d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
324e0 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
324f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
32500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32510 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
32520 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
32530 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
32540 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
32550 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
32560 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
32570 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
32580 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
32590 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
325a0 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
325b0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
325c0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
325d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
325f0 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
32600 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
32610 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
32620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32630 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
32640 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
32650 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65  pend */.  int se
32660 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  ekResult        
32670 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
32680 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 71 6c 69  lt of prior sqli
32690 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29  te3BtreeMoveto()
326a0 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   call */.){.  in
326b0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20  t rc;.  int loc 
326c0 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20  = seekResult;.  
326d0 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74  int szNew;.  int
326e0 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
326f0 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20  *pPage;.  Btree 
32700 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
32710 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
32720 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
32730 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c  nsigned char *ol
32740 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  dCell;.  unsigne
32750 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20  d char *newCell 
32760 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
32770 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
32780 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
32790 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
327a0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
327b0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
327c0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
327d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
327e0 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 72  r->wrFlag );.  r
327f0 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64  c = checkForRead
32800 43 6f 6e 66 6c 69 63 74 73 28 70 43 75 72 2d 3e  Conflicts(pCur->
32810 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
32820 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b  noRoot, pCur, nK
32830 65 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ey);.  if( rc ){
32840 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
32850 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70    /* The table p
32860 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
32870 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
32880 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
32890 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  =SQLITE_LOCKED_S
328a0 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20  HAREDCACHE );.  
328b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
328c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
328d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
328e0 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
328f0 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
32900 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
32910 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
32920 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
32930 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
32940 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73  ..  **.  ** In s
32950 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 63  ome cases, the c
32960 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
32970 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f  reeMoveto() belo
32980 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f  w is a no-op. Fo
32990 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  r.  ** example, 
329a0 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
329b0 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
329c0 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72   with auto-gener
329d0 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a  ated integer.  *
329e0 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45  * keys, the VDBE
329f0 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73   layer invokes s
32a00 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
32a10 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
32a20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65  the .  ** intege
32a30 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74  r key to use. It
32a40 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73   then calls this
32a50 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74   function to act
32a60 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65  ually insert the
32a70 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f   .  ** data into
32a80 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72   the intkey B-Tr
32a90 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
32aa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
32ab0 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73  eto() recognizes
32ac0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63  .  ** that the c
32ad0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
32ae0 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20   where it needs 
32af0 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e  to be and return
32b00 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64  s without.  ** d
32b10 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54  oing any work. T
32b20 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e  o avoid thwartin
32b30 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  g these optimiza
32b40 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70  tions, it is imp
32b50 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20  ortant.  ** not 
32b60 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72  to clear the cur
32b70 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  sor here..  */. 
32b80 20 69 66 28 0a 20 20 20 20 53 51 4c 49 54 45 5f   if(.    SQLITE_
32b90 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
32ba0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
32bb0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
32bc0 75 72 29 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26  ur)) || (!loc &&
32bd0 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
32be0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
32bf0 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
32c00 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e  Key, nKey, appen
32c10 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20  dBias, &loc)).  
32c20 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  )){.    return r
32c30 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20  c;.  }..  pPage 
32c40 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
32c50 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
32c60 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
32c70 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
32c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
32c90 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
32ca0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
32cb0 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
32cc0 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
32cd0 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
32ce0 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
32cf0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
32d00 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
32d10 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
32d20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
32d30 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
32d40 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
32d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
32d60 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f  isInit );.  allo
32d70 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
32d80 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20  t);.  newCell = 
32d90 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
32da0 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30    if( newCell==0
32db0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
32dc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66  _NOMEM;.  rc = f
32dd0 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c  illInCell(pPage,
32de0 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20   newCell, pKey, 
32df0 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61  nKey, pData, nDa
32e00 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65  ta, nZero, &szNe
32e10 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  w);.  if( rc ) g
32e20 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
32e30 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d    assert( szNew=
32e40 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
32e50 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a  ge, newCell) );.
32e60 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c    assert( szNew<
32e70 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42  =MX_CELL_SIZE(pB
32e80 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43  t) );.  idx = pC
32e90 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
32ea0 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f  iPage];.  if( lo
32eb0 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56  c==0 && CURSOR_V
32ec0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
32ed0 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  te ){.    u16 sz
32ee0 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
32ef0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
32f00 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  l );.    rc = sq
32f10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32f20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
32f30 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
32f40 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
32f50 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sert;.    }.    
32f60 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65  oldCell = findCe
32f70 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  ll(pPage, idx);.
32f80 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
32f90 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65  leaf ){.      me
32fa0 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c  mcpy(newCell, ol
32fb0 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d  dCell, 4);.    }
32fc0 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c  .    szOld = cel
32fd0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
32fe0 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63  oldCell);.    rc
32ff0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
33000 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
33010 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
33020 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
33030 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
33040 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29  age, idx, szOld)
33050 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
33060 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
33070 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
33080 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
33090 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
330a0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
330b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
330c0 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69  e->leaf );.    i
330d0 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
330e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
330f0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
33100 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
33110 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
33120 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
33130 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
33140 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
33150 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
33160 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c  age, idx, newCel
33170 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
33180 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
33190 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
331a0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50  e->nCell>0 || pP
331b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
331c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20   );..  /* If no 
331d0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
331e0 64 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28  d, call balance(
331f0 29 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61  ) to deal with a
33200 6e 79 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 0a  ny overflow and.
33210 20 20 2a 2a 20 6d 6f 76 65 20 74 68 65 20 63 75    ** move the cu
33220 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  rsor to point at
33230 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
33240 20 74 61 62 6c 65 20 28 73 69 6e 63 65 20 62 61   table (since ba
33250 6c 61 6e 63 65 20 6d 61 79 0a 20 20 2a 2a 20 68  lance may.  ** h
33260 61 76 65 20 72 65 61 72 72 61 6e 67 65 64 20 74  ave rearranged t
33270 68 65 20 74 61 62 6c 65 20 69 6e 20 73 75 63 68  he table in such
33280 20 61 20 77 61 79 20 61 73 20 74 6f 20 69 6e 76   a way as to inv
33290 61 6c 69 64 61 74 65 20 42 74 43 75 72 73 6f 72  alidate BtCursor
332a0 2e 61 70 50 61 67 65 5b 5d 0a 20 20 2a 2a 20 6f  .apPage[].  ** o
332b0 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
332c0 5b 5d 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  [])..  **.  ** E
332d0 78 63 65 70 74 2c 20 69 66 20 61 6c 6c 20 6f 66  xcept, if all of
332e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
332f0 72 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 68  re true, do noth
33300 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
33310 20 2a 20 49 6e 73 65 72 74 69 6e 67 20 74 68 65   * Inserting the
33320 20 6e 65 77 20 63 65 6c 6c 20 64 69 64 20 6e 6f   new cell did no
33330 74 20 63 61 75 73 65 20 6f 76 65 72 66 6c 6f 77  t cause overflow
33340 2c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ,.  **.  **   * 
33350 42 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67  Before inserting
33360 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 74 68   the new cell th
33370 65 20 63 75 72 73 6f 72 20 77 61 73 20 70 6f 69  e cursor was poi
33380 6e 74 69 6e 67 20 61 74 20 74 68 65 20 0a 20 20  nting at the .  
33390 2a 2a 20 20 20 20 20 6c 61 72 67 65 73 74 20 6b  **     largest k
333a0 65 79 20 69 6e 20 61 6e 20 69 6e 74 6b 65 79 20  ey in an intkey 
333b0 42 2d 54 72 65 65 2c 20 61 6e 64 0a 20 20 2a 2a  B-Tree, and.  **
333c0 0a 20 20 2a 2a 20 20 20 2a 20 54 68 65 20 6b 65  .  **   * The ke
333d0 79 20 76 61 6c 75 65 20 61 73 73 6f 63 69 61 74  y value associat
333e0 65 64 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ed with the new 
333f0 63 65 6c 6c 20 69 73 20 6e 6f 77 20 74 68 65 20  cell is now the 
33400 6c 61 72 67 65 73 74 20 0a 20 20 2a 2a 20 20 20  largest .  **   
33410 20 20 69 6e 20 74 68 65 20 42 2d 54 72 65 65 2e    in the B-Tree.
33420 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68  .  **.  ** In th
33430 69 73 20 63 61 73 65 20 74 68 65 20 63 75 72 73  is case the curs
33440 6f 72 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  or can be safely
33450 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
33460 74 20 74 68 65 20 28 6e 65 77 29 20 0a 20 20 2a  t the (new) .  *
33470 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  * largest key va
33480 6c 75 65 20 69 6e 20 74 68 65 20 42 2d 54 72 65  lue in the B-Tre
33490 65 2e 20 44 6f 69 6e 67 20 73 6f 20 73 70 65 65  e. Doing so spee
334a0 64 73 20 75 70 20 69 6e 73 65 72 74 69 6e 67 20  ds up inserting 
334b0 61 20 73 65 74 0a 20 20 2a 2a 20 6f 66 20 65 6e  a set.  ** of en
334c0 74 72 69 65 73 20 77 69 74 68 20 69 6e 63 72 65  tries with incre
334d0 61 73 69 6e 67 20 69 6e 74 65 67 65 72 20 6b 65  asing integer ke
334e0 79 20 76 61 6c 75 65 73 20 76 69 61 20 61 20 73  y values via a s
334f0 69 6e 67 6c 65 20 63 75 72 73 6f 72 0a 20 20 2a  ingle cursor.  *
33500 2a 20 28 63 6f 6d 65 73 20 75 70 20 77 69 74 68  * (comes up with
33510 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e   "INSERT INTO ..
33520 2e 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  . SELECT ..." st
33530 61 74 65 6d 65 6e 74 73 29 2c 20 61 73 20 0a 20  atements), as . 
33540 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 69 6e 73   ** the next ins
33550 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  ert operation is
33560 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
33570 20 73 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72   seek the cursor
33580 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
33590 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26  =SQLITE_OK .   &
335a0 26 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  & (pPage->nOverf
335b0 6c 6f 77 20 7c 7c 20 21 70 43 75 72 2d 3e 61 74  low || !pCur->at
335c0 4c 61 73 74 20 7c 7c 20 6c 6f 63 3e 3d 30 20 7c  Last || loc>=0 |
335d0 7c 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  | !pCur->apPage[
335e0 30 5d 2d 3e 69 6e 74 4b 65 79 29 0a 20 20 29 7b  0]->intKey).  ){
335f0 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
33600 65 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 20 20  e(pCur, 1);.    
33610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33620 4b 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54  K ){.      moveT
33630 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 20  oRoot(pCur);.   
33640 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4d   }.  }.  .  /* M
33650 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f  ust make sure nO
33660 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74  verflow is reset
33670 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66   to zero even if
33680 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20   the balance(). 
33690 20 2a 2a 20 66 61 69 6c 73 2e 20 20 49 6e 74 65   ** fails.  Inte
336a0 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
336b0 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ure corruption w
336c0 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72  ill result other
336d0 77 69 73 65 2e 20 2a 2f 0a 20 20 70 43 75 72 2d  wise. */.  pCur-
336e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
336f0 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  age]->nOverflow 
33700 3d 20 30 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74  = 0;..end_insert
33710 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
33720 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
33730 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
33740 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
33750 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75  ting to.  The cu
33760 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
33770 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72  pointing at a ar
33780 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e  bitrary location
33790 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
337a0 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
337b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
337c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
337d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
337e0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e 74  r->iPage];.  int
337f0 20 69 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64   idx;.  unsigned
33800 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
33810 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
33820 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  gnoChild = 0;.  
33830 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
33840 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
33850 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
33860 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
33870 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
33880 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
33890 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
338a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
338b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
338c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
338d0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
338e0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
338f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
33900 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
33910 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
33920 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28  >skip;.  }.  if(
33930 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49   NEVER(pCur->aiI
33940 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
33950 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 20 29  =pPage->nCell) )
33960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33970 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54  ITE_ERROR;  /* T
33980 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
33990 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79   pointing to any
339a0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 61  thing */.  }.  a
339b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
339c0 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63 68  lag );.  rc = ch
339d0 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69  eckForReadConfli
339e0 63 74 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  cts(p, pCur->pgn
339f0 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75  oRoot, pCur, pCu
33a00 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20  r->info.nKey);. 
33a10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33a20 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
33a30 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
33a40 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
33a50 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61 73 73   lock */.    ass
33a60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
33a70 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
33a80 48 45 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  HE );.    return
33a90 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   rc;.  }..  /* R
33aa0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
33ab0 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
33ac0 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74  on (a no-op if t
33ad0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
33ae0 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52   in .  ** CURSOR
33af0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
33b00 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65  te) and save the
33b10 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
33b20 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
33b30 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68  .  ** open on th
33b40 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68  e same table. Th
33b50 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  en call sqlite3P
33b60 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
33b70 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61  he page.  ** tha
33b80 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c  t the entry will
33b90 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
33ba0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
33bb0 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43    (rc = restoreC
33bc0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
33bd0 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
33be0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
33bf0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
33c00 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21  gnoRoot, pCur))!
33c10 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20  =0 ||.    (rc = 
33c20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33c30 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
33c40 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  ))!=0.  ){.    r
33c50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
33c60 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
33c70 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70  ell within its p
33c80 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
33c90 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
33ca0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
33cb0 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
33cc0 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
33cd0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
33ce0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
33cf0 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
33d00 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
33d10 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
33d20 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  /.  idx = pCur->
33d30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
33d40 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  e];.  pCell = fi
33d50 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
33d60 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  x);.  if( !pPage
33d70 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
33d80 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
33d90 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20  te(pCell);.  }. 
33da0 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
33db0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
33dc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
33dd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
33de0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
33df0 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  f ){.    /*.    
33e00 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20  ** The entry we 
33e10 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c  are about to del
33e20 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  ete is not a lea
33e30 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f  f so if we do no
33e40 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65  t.    ** do some
33e50 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65  thing we will le
33e60 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e  ave a hole on an
33e70 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a   internal page..
33e80 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74      ** We have t
33e90 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20  o fill the hole 
33ea0 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63  by moving in a c
33eb0 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e  ell from a leaf.
33ec0 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78    The.    ** nex
33ed0 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65  t Cell after the
33ee0 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74   one to be delet
33ef0 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ed is guaranteed
33f00 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20   to exist and.  
33f10 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61    ** to be a lea
33f20 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20  f so we can use 
33f30 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42  it..    */.    B
33f40 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b  tCursor leafCur;
33f50 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c  .    MemPage *pL
33f60 65 61 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  eafPage = 0;..  
33f70 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
33f80 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20  *pNext;.    int 
33f90 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73  notUsed;.    uns
33fa0 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
33fb0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  Cell = 0;.    as
33fc0 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69 6e  sert( !pPage->in
33fd0 74 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69  tKey );.    sqli
33fe0 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
33ff0 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61  ursor(pCur, &lea
34000 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  fCur);.    rc = 
34010 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
34020 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
34030 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
34040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34050 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
34060 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43  fCur.aiIdx[leafC
34070 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a  ur.iPage]==0 );.
34080 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20        pLeafPage 
34090 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  = leafCur.apPage
340a0 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b  [leafCur.iPage];
340b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
340c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
340d0 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65  eafPage->pDbPage
340e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
340f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34100 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61 66  {.      int leaf
34110 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20  CursorInvalid = 
34120 30 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e  0;.      u16 szN
34130 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ext;.      TRACE
34140 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
34150 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72  =%d delete inter
34160 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c  nal from %d repl
34170 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ace from leaf %d
34180 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43  \n",.         pC
34190 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
341a0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66  age->pgno, pLeaf
341b0 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
341c0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
341d0 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ge, idx, cellSiz
341e0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
341f0 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  l));.      pNext
34200 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61   = findCell(pLea
34210 66 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  fPage, 0);.     
34220 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69   szNext = cellSi
34230 7a 65 50 74 72 28 70 4c 65 61 66 50 61 67 65 2c  zePtr(pLeafPage,
34240 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
34250 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
34260 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
34270 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  +4 );.      allo
34280 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
34290 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65  t);.      tempCe
342a0 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
342b0 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ace;.      if( t
342c0 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
342d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
342e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
342f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
34300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34310 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43      rc = insertC
34320 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
34330 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b  pNext-4, szNext+
34340 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b  4, tempCell, 0);
34350 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
34360 20 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74 61   /* The "if" sta
34370 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e 65  tement in the ne
34380 78 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73  xt code block is
34390 20 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65 0a   critical.  The.
343a0 20 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74 65        ** slighte
343b0 73 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61 74  st error in that
343c0 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64   statement would
343d0 20 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f   allow SQLite to
343e0 20 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20 2a   operate.      *
343f0 2a 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74  * correctly most
34400 20 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75 74   of the time but
34410 20 70 72 6f 64 75 63 65 20 76 65 72 79 20 72 61   produce very ra
34420 72 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54 6f  re failures.  To
34430 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64 20  .      ** guard 
34440 61 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74 68  against this, th
34450 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
34460 6f 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69 66  os help to verif
34470 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  y that.      ** 
34480 74 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65  the "if" stateme
34490 6e 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74 65  nt is well teste
344a0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
344b0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
344c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
344d0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
344e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
344f0 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20  2/3 .           
34500 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
34510 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
34520 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
34530 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
34540 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
34550 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
34560 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  && pPage->nFree=
34570 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
34580 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20  *2/3 .          
34590 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
345a0 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
345b0 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
345c0 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
345d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
345e0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
345f0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
34600 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ==pBt->usableSiz
34610 65 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20 20  e*2/3+1 .       
34620 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
34630 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
34640 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
34650 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
34660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34670 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34680 3e 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  >0 && pPage->nFr
34690 65 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ee<=pBt->usableS
346a0 69 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20 20  ize*2/3.        
346b0 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61           && pLea
346c0 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
346d0 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
346e0 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20  bleSize*2/3 );. 
346f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
34700 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34710 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46  >0 || (pPage->nF
34720 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ree > pBt->usabl
34730 65 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20  eSize*2/3)).    
34740 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
34750 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
34760 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74  +2+szNext == pBt
34770 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
34780 20 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28 20   );...      if( 
34790 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  (pPage->nOverflo
347a0 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e  w>0 || (pPage->n
347b0 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62  Free > pBt->usab
347c0 6c 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a  leSize*2/3)) &&.
347d0 20 20 20 20 20 20 20 20 20 20 28 70 4c 65 61 66            (pLeaf
347e0 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
347f0 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
34800 6c 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20  leSize*2/3).    
34810 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
34820 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
34830 61 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74 65  aken if the inte
34840 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77  rnal node is now
34850 20 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f 77   either overflow
34860 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ing.        ** o
34870 72 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20  r underfull and 
34880 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69  the leaf node wi
34890 6c 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 20  ll be underfull 
348a0 61 66 74 65 72 20 74 68 65 20 6a 75 73 74 20 63  after the just c
348b0 65 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ell .        ** 
348c0 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69 6e  copied to the in
348d0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64  ternal node is d
348e0 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e 20  eleted from it. 
348f0 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61  This is a specia
34900 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  l.        ** cas
34910 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  e because the ca
34920 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20  ll to balance() 
34930 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20 69  to correct the i
34940 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20  nternal node.   
34950 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e       ** may chan
34960 67 65 20 74 68 65 20 74 72 65 65 20 73 74 72 75  ge the tree stru
34970 63 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c 69  cture and invali
34980 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
34990 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
349a0 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61  the leafCur.apPa
349b0 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72  ge[] and leafCur
349c0 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 2c  .aiIdx[] arrays,
349d0 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 20   which will be. 
349e0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62         ** used b
349f0 79 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  y the balance() 
34a00 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72 72  required to corr
34a10 65 63 74 20 74 68 65 20 75 6e 64 65 72 66 75 6c  ect the underful
34a20 6c 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a  l leaf.        *
34a30 2a 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  * node..        
34a40 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
34a50 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 69  e formula used i
34a60 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
34a70 20 61 62 6f 76 65 20 61 72 65 20 62 61 73 65 64   above are based
34a80 20 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20 20   on facets of.  
34a90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
34aa0 69 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20  ite file-format 
34ab0 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e  that do not chan
34ac0 67 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20  ge over time..  
34ad0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34ae0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
34af0 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73  ->nFree==pBt->us
34b00 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29  ableSize*2/3+1 )
34b10 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
34b20 73 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e  se( pLeafPage->n
34b30 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70  Free+2+szNext==p
34b40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
34b50 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  /3+1 );.        
34b60 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
34b70 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 20  d = 1;.      }  
34b80 20 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69 66        ..      if
34b90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34ba0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
34bb0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
34bc0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
34bd0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
34be0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
34bf0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
34c00 70 50 61 67 65 2c 20 69 64 78 29 2c 20 70 67 6e  pPage, idx), pgn
34c10 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  oChild);.       
34c20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
34c30 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
34c40 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63   0 );.        rc
34c50 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
34c60 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
34c70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34c80 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75 72  TE_OK && leafCur
34c90 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20  sorInvalid ){.  
34ca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 61        /* The lea
34cb0 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e  f-node is now un
34cc0 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74  derfull and so t
34cd0 68 65 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f  he tree needs to
34ce0 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
34cf0 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65  rebalanced. Howe
34d00 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63 65  ver, the balance
34d10 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  () operation on 
34d20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20  the internal.   
34d30 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f       ** node abo
34d40 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64 69  ve may have modi
34d50 66 69 65 64 20 74 68 65 20 73 74 72 75 63 74 75  fied the structu
34d60 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65  re of the B-Tree
34d70 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
34d80 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  so the current c
34d90 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66 43  ontents of leafC
34da0 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  ur.apPage[] and 
34db0 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a  leafCur.aiIdx[].
34dc0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e          ** may n
34dd0 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 20  ot be trusted.. 
34de0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34df0 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    ** It is not p
34e00 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79 20  ossible to copy 
34e10 74 68 65 20 61 6e 63 65 73 74 72 79 20 66 72 6f  the ancestry fro
34e20 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65 20 73  m pCur, as the s
34e30 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ame.        ** b
34e40 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68 61  alance() call ha
34e50 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74 68  s invalidated th
34e60 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d  e pCur->apPage[]
34e70 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20 20   and aiIdx[].   
34e80 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20       ** arrays. 
34e90 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
34ea0 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20      ** The call 
34eb0 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  to saveCursorPos
34ec0 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e  ition() below in
34ed0 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20 74  ternally saves t
34ee0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b  he .        ** k
34ef0 65 79 20 74 68 61 74 20 6c 65 61 66 43 75 72 20  ey that leafCur 
34f00 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
34f10 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e  nting to. Curren
34f20 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20 20  tly, there.     
34f30 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f     ** are two co
34f40 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65 79  pies of that key
34f50 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20 6f   in the tree - o
34f60 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  ne here on the l
34f70 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eaf.        ** p
34f80 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73  age and one on s
34f90 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ome internal nod
34fa0 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20 54  e in the tree. T
34fb0 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20  he copy on.     
34fc0 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e     ** the leaf n
34fd0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 74 68  ode is always th
34fe0 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74 72  e next key in tr
34ff0 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20 74  ee-order after t
35000 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
35010 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  opy on the inter
35020 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68  nal node. So, th
35030 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
35040 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20 20  3BtreeNext().   
35050 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65       ** calls re
35060 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
35070 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20 74  ion() to point t
35080 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
35090 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a 2a   copy.        **
350a0 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 69   stored on the i
350b0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68  nternal node, th
350c0 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20 74  en advances to t
350d0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20  he next entry,. 
350e0 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20         ** which 
350f0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
35100 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65  e copy of the ke
35110 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  y on the interna
35120 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  l node..        
35130 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20 6c  ** Net effect: l
35140 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74 69  eafCur is pointi
35150 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  ng back to the d
35160 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20 20  uplicate cell.  
35170 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e 65        ** that ne
35180 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eds to be remove
35190 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66 43  d, and the leafC
351a0 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a  ur.apPage[] and.
351b0 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66 43          ** leafC
351c0 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79  ur.aiIdx[] array
351d0 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 20  s are correct.. 
351e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
351f0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f    VVA_ONLY( Pgno
35200 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61   leafPgno = pLea
35210 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  fPage->pgno );. 
35220 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
35230 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26  CursorPosition(&
35240 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20 20  leafCur);.      
35250 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
35270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
35280 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c  eeNext(&leafCur,
35290 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
352a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c      }.        pL
352b0 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75  eafPage = leafCu
352c0 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72  r.apPage[leafCur
352d0 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 20  .iPage];.       
352e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
352f0 49 54 45 5f 4f 4b 20 7c 7c 20 70 4c 65 61 66 50  ITE_OK || pLeafP
35300 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50  age->pgno==leafP
35310 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 61  gno );.        a
35320 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
35330 45 5f 4f 4b 20 7c 7c 20 6c 65 61 66 43 75 72 2e  E_OK || leafCur.
35340 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50  aiIdx[leafCur.iP
35350 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  age]==0 );.     
35360 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 53 51   }..      if( SQ
35370 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20  LITE_OK==rc.    
35380 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d     && SQLITE_OK=
35390 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
353a0 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50 61  gerWrite(pLeafPa
353b0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20  ge->pDbPage)) . 
353c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
353d0 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50 61  dropCell(pLeafPa
353e0 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b 0a  ge, 0, szNext);.
353f0 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59          VVA_ONLY
35400 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53  ( leafCur.pagesS
35410 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20  huffled = 0 );. 
35420 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
35430 6e 63 65 28 26 6c 65 61 66 43 75 72 2c 20 30 29  nce(&leafCur, 0)
35440 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
35450 28 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61  ( leafCursorInva
35460 6c 69 64 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e  lid || !leafCur.
35470 70 61 67 65 73 53 68 75 66 66 6c 65 64 0a 20 20  pagesShuffled.  
35480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354a0 20 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67 65 73   || !pCur->pages
354b0 53 68 75 66 66 6c 65 64 20 29 3b 0a 20 20 20 20  Shuffled );.    
354c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
354d0 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
354e0 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61  eTempCursor(&lea
354f0 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fCur);.  }else{.
35500 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
35510 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
35520 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ete from leaf %d
35530 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72  \n",.       pCur
35540 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
35550 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72  e->pgno));.    r
35560 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61  c = dropCell(pPa
35570 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ge, idx, cellSiz
35580 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
35590 6c 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  l));.    if( rc=
355a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
355b0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
355c0 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
355d0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
355e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
355f0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
35600 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
35610 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
35620 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20 74  te a new BTree t
35630 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74  able.  Write int
35640 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70  o *piTable the p
35650 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
35660 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
35670 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
35680 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65  ..**.** The type
35690 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74 65   of type is dete
356a0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c  rmined by the fl
356b0 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20  ags parameter.  
356c0 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  Only the.** foll
356d0 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20  owing values of 
356e0 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65 6e  flags are curren
356f0 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68  tly in use.  Oth
35700 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a  er values for.**
35710 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74   flags might not
35720 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   work:.**.**    
35730 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54   BTREE_INTKEY|BT
35740 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20  REE_LEAFDATA    
35750 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61   Used for SQL ta
35760 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64 20  bles with rowid 
35770 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45  keys.**     BTRE
35780 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20  E_ZERODATA      
35790 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 64              Used
357a0 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73   for SQL indices
357b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
357c0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
357d0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
357e0 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
357f0 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  s){.  BtShared *
35800 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
35810 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
35820 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b    Pgno pgnoRoot;
35830 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
35840 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
35850 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
35860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
35870 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
35880 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
35890 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
358a0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66  readOnly );..#if
358b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
358c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20  AUTOVACUUM.  rc 
358d0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
358e0 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c  age(pBt, &pRoot,
358f0 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30   &pgnoRoot, 1, 0
35900 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
35910 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
35920 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  }.#else.  if( pB
35930 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
35940 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f  .    Pgno pgnoMo
35950 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ve;      /* Move
35960 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20   a page here to 
35970 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
35980 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  e root-page */. 
35990 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
359a0 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61  eMove; /* The pa
359b0 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a  ge to move to. *
359c0 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69  /..    /* Creati
359d0 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d  ng a new table m
359e0 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75  ay probably requ
359f0 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78  ire moving an ex
35a00 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a  isting database.
35a10 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72      ** to make r
35a20 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20  oom for the new 
35a30 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65  tables root page
35a40 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70  . In case this p
35a50 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a  age turns.    **
35a60 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76   out to be an ov
35a70 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c  erflow page, del
35a80 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77  ete all overflow
35a90 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73   page-map caches
35aa0 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20  .    ** held by 
35ab0 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20  open cursors..  
35ac0 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64    */.    invalid
35ad0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
35ae0 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f  che(pBt);..    /
35af0 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  * Read the value
35b00 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d   of meta[3] from
35b10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
35b20 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65   determine where
35b30 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
35b40 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
35b50 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f   table should go
35b60 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65  . meta[3] is the
35b70 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
35b80 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  ge.    ** create
35b90 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65  d so far, so the
35ba0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69   new root-page i
35bb0 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20  s (meta[3]+1).. 
35bc0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
35bd0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
35be0 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47  ta(p, BTREE_LARG
35bf0 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26  EST_ROOT_PAGE, &
35c00 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
35c10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35c20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35c30 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
35c40 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20  gnoRoot++;..    
35c50 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d  /* The new root-
35c60 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
35c70 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70  allocated on a p
35c80 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
35c90 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50   or the.    ** P
35ca0 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65  ENDING_BYTE page
35cb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
35cc0 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54  le( pgnoRoot==PT
35cd0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
35ce0 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20   pgnoRoot) ||.  
35cf0 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d        pgnoRoot==
35d00 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35d10 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
35d20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20  pgnoRoot++;.    
35d30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  }.    assert( pg
35d40 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20  noRoot>=3 );..  
35d50 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
35d60 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74  page. The page t
35d70 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  hat currently re
35d80 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f  sides at pgnoRoo
35d90 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
35da0 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c   moved to the al
35db0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e  located page (un
35dc0 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74  less the allocat
35dd0 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a  ed page happens.
35de0 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65      ** to reside
35df0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20   at pgnoRoot).. 
35e00 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61     */.    rc = a
35e10 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
35e20 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65  (pBt, &pPageMove
35e30 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e  , &pgnoMove, pgn
35e40 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69  oRoot, 1);.    i
35e50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35e60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35e70 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
35e80 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67  if( pgnoMove!=pg
35e90 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
35ea0 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  /* pgnoRoot is t
35eb0 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  he page that wil
35ec0 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
35ed0 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20  e root-page of. 
35ee0 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
35ef0 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20  table (assuming 
35f00 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74  an error did not
35f10 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20   occur). But we 
35f20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  were.      ** al
35f30 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65  located pgnoMove
35f40 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69  . If required (i
35f50 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f  .e. if it was no
35f60 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  t allocated.    
35f70 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e    ** by extendin
35f80 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65  g the file), the
35f90 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74   current page at
35fa0 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f   position pgnoMo
35fb0 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  ve.      ** is a
35fc0 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64  lready journaled
35fd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35fe0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
35ff0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
36000 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
36010 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a  ge(pPageMove);..
36020 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68        /* Move th
36030 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
36040 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20   at pgnoRoot to 
36050 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20  pgnoMove. */.   
36060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
36070 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
36080 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
36090 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
360a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
360b0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
360c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
360d0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
360e0 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
360f0 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
36100 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
36110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
36120 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
36130 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
36140 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
36150 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
36160 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
36170 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
36180 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
36190 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
361a0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
361b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
361c0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
361d0 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
361e0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
361f0 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
36200 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
36210 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  pgnoMove, 0);.  
36220 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
36230 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
36240 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
36250 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
36260 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
36270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36280 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
362a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
362b0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
362c0 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
362d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
362e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
362f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
36310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36320 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
36330 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
36340 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36350 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
36360 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
36370 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36380 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
36390 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
363a0 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
363b0 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
363c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
363d0 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
363e0 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
363f0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
36400 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
36410 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
36420 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
36430 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
36440 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
36450 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
36460 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36470 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
36480 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
36490 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
364a0 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
364b0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
364c0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
364d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
364e0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
364f0 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
36500 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36510 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
36520 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
36530 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36540 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
36550 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
36560 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36570 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
36580 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
36590 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
365a0 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
365b0 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
365c0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
365d0 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
365e0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
365f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
36600 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
36610 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
36620 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
36630 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
36640 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
36650 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
36660 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65  .  rc = btreeCre
36670 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61  ateTable(p, piTa
36680 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73  ble, flags);.  s
36690 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
366a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
366b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
366c0 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
366d0 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  ase page and all
366e0 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20   its children.  
366f0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61  Return.** the pa
36700 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
36710 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
36720 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  t clearDatabaseP
36730 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
36740 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
36750 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61  /* The BTree tha
36760 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
36770 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  able */.  Pgno p
36780 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
36790 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
367a0 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74  o clear */.  int
367b0 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20 20   freePageFlag,  
367c0 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
367d0 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
367e0 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65  .  int *pnChange
367f0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
36800 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
36810 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
36820 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
36830 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
36840 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
36850 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
36860 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67  ;.  if( pgno>pag
36870 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
36880 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
36890 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
368a0 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
368b0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
368c0 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
368d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
368e0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
368f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
36900 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
36910 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
36920 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
36930 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
36940 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
36950 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
36960 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
36970 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
36980 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  ell), 1, pnChang
36990 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
369a0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
369b0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
369c0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c     }.    rc = cl
369d0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
369e0 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
369f0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
36a00 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
36a10 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
36a20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
36a30 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
36a40 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
36a50 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
36a60 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  [8]), 1, pnChang
36a70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
36a80 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
36a90 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
36aa0 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67  else if( pnChang
36ab0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
36ac0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
36ad0 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20  ;.    *pnChange 
36ae0 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b  += pPage->nCell;
36af0 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
36b00 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
36b10 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
36b20 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
36b30 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
36b40 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
36b50 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
36b60 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
36b70 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
36b80 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
36b90 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
36ba0 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
36bb0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
36bc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
36bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
36be0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
36bf0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
36c00 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
36c10 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
36c20 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
36c30 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
36c40 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
36c50 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
36c60 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
36c70 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
36c80 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
36c90 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
36ca0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
36cb0 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
36cc0 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
36cd0 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
36ce0 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
36cf0 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
36d00 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
36d10 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
36d20 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
36d30 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  able..**.** If p
36d40 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e  nChange is not N
36d50 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20  ULL, then table 
36d60 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61  iTable must be a
36d70 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20  n intkey table. 
36d80 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76  The.** integer v
36d90 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  alue pointed to 
36da0 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69  by pnChange is i
36db0 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
36dc0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
36dd0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61  ntries in the ta
36de0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
36df0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
36e00 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
36e10 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e   iTable, int *pn
36e20 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72  Change){.  int r
36e30 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
36e40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
36e50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
36e60 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
36e70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
36e80 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
36e90 28 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65  (rc = checkForRe
36ea0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
36eb0 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53  Table, 0, 1))!=S
36ec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36ed0 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
36ee0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
36ef0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
36f00 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
36f10 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
36f20 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
36f30 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
36f40 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  lse{.    rc = cl
36f50 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
36f60 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
36f70 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b  e, 0, pnChange);
36f80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
36f90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
36fa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36fb0 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66  ** Erase all inf
36fc0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61  ormation in a ta
36fd0 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ble and add the 
36fe0 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
36ff0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65  e to.** the free
37000 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74  list.  Except, t
37010 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70  he root of the p
37020 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28  rinciple table (
37030 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61  the one on.** pa
37040 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61  ge 1) is never a
37050 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
37060 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
37070 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
37080 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
37090 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
370a0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63  re any open.** c
370b0 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
370c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  ble..**.** If AU
370d0 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
370e0 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  led and the page
370f0 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f   at iTable is no
37100 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f  t the last.** ro
37110 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
37120 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
37130 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  en the last root
37140 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65   page .** in the
37150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
37160 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65  s moved into the
37170 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
37180 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54  ccupied by.** iT
37190 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61  able and that la
371a0 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  st slot formerly
371b0 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65   occupied by the
371c0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a   last root page.
371d0 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
371e0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74  he freelist inst
371f0 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20  ead of iTable.  
37200 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c  In this say, all
37210 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61  .** root pages a
37220 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62  re kept at the b
37230 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
37240 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
37250 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73  hich.** is neces
37260 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43  sary for AUTOVAC
37270 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68  UUM to work righ
37280 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  t.  *piMoved is 
37290 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70  set to the .** p
372a0 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
372b0 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  used to be the l
372c0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ast root page in
372d0 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
372e0 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49  .** the move.  I
372f0 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d  f no page gets m
37300 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69  oved, *piMoved i
37310 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54  s set to 0..** T
37320 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
37330 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e  e is recorded in
37340 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65   meta[3] and the
37350 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74   value of.** met
37360 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20  a[3] is updated 
37370 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  by this procedur
37380 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
37390 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
373a0 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
373b0 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
373c0 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
373d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
373e0 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
373f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
37400 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37410 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
37420 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
37430 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
37440 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20  ANS_WRITE );..  
37450 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
37460 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
37470 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
37480 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
37490 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
374a0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
374b0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
374c0 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
374d0 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
374e0 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
374f0 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
37500 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
37510 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
37520 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
37530 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
37540 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
37550 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
37560 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
37570 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
37580 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
37590 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
375a0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
375b0 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d  pCursor->pBtree-
375c0 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
375d0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
375e0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
375f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
37600 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
37610 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
37620 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
37630 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
37640 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
37650 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
37660 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
37670 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
37680 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
37690 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
376a0 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64  .  }..  *piMoved
376b0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61   = 0;..  if( iTa
376c0 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20  ble>1 ){.#ifdef 
376d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
376e0 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20  VACUUM.    rc = 
376f0 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
37700 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
37710 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20  (pPage);.#else. 
37720 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
37730 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
37740 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  Pgno maxRootPgno
37750 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
37760 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
37770 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53  (p, BTREE_LARGES
37780 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 6d 61  T_ROOT_PAGE, &ma
37790 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
377a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
377b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
377c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
377d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
377e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
377f0 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
37800 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
37810 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
37820 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
37830 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
37840 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
37850 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
37860 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
37870 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
37880 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
37890 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
378a0 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
378b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
378c0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
378d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
378e0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
378f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
37920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
37930 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
37940 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
37950 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20  ropped does not 
37960 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74  have the largest
37970 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
37980 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
37990 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f  the database. So
379a0 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74   move the page t
379b0 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68  hat does into th
379c0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61  e .        ** ga
379d0 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
379e0 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e  leted root-page.
379f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
37a00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f      MemPage *pMo
37a10 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  ve;.        rele
37a20 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
37a30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37a40 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
37a50 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
37a60 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20  o, &pMove, 0);. 
37a70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37a80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37a90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37aa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37ab0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
37ac0 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c  Page(pBt, pMove,
37ad0 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
37ae0 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b  , 0, iTable, 0);
37af0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
37b00 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
37b10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
37b20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37b30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
37b60 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
37b70 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
37b80 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
37b90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37ba0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
37bb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
37bd0 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29   freePage(pMove)
37be0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
37bf0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
37c00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37c20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37c40 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78    *piMoved = max
37c50 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
37c60 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
37c70 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f  the new 'max-roo
37c80 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e  t-page' value in
37c90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65   the database he
37ca0 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20  ader. This.     
37cb0 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76   ** is the old v
37cc0 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c  alue less one, l
37cd0 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20  ess one more if 
37ce0 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a  that happens to.
37cf0 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f        ** be a ro
37d00 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20  ot-page number, 
37d10 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69  less one again i
37d20 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  f that is the.  
37d30 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
37d40 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20  YTE_PAGE..      
37d50 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  */.      maxRoot
37d60 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66  Pgno--;.      if
37d70 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
37d80 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
37d90 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
37da0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
37db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37dc0 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
37dd0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
37de0 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29  , maxRootPgno) )
37df0 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
37e00 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
37e10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
37e20 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44  axRootPgno!=PEND
37e30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
37e40 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  t) );..      rc 
37e50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
37e60 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d  dateMeta(p, 4, m
37e70 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
37e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
37e90 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
37ea0 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
37eb0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
37ec0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
37ed0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  se{.    /* If sq
37ee0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
37ef0 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f  ble was called o
37f00 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20  n page 1. */.   
37f10 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
37f20 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
37f30 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65  LEAF );.    rele
37f40 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
37f50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37f60 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33    .}.int sqlite3
37f70 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  BtreeDropTable(B
37f80 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
37f90 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
37fa0 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
37fb0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
37fc0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
37fd0 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69  eeDropTable(p, i
37fe0 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b  Table, piMoved);
37ff0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
38000 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
38010 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
38020 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
38030 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
38040 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
38050 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
38060 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
38070 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
38080 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
38090 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
380a0 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
380b0 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
380c0 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
380d0 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
380e0 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
380f0 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
38100 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
38110 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
38120 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
38130 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
38140 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
38150 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
38160 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
38170 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
38180 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
38190 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
381a0 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
381b0 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
381c0 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
381d0 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
381e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
381f0 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
38200 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a  , int idx, u32 *
38210 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65  pMeta){.  DbPage
38220 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20   *pDbPage = 0;. 
38230 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
38240 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
38250 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
38260 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
38270 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
38280 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20  ;..  /* Reading 
38290 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75  a meta-data valu
382a0 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61  e requires a rea
382b0 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
382c0 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a   (and hence.  **
382d0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
382e0 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61  er table. We gra
382f0 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61  b this lock rega
38300 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
38310 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  r or.  ** not th
38320 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  e SQLITE_ReadUnc
38330 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
38340 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20   set (the table 
38350 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20  rooted at page. 
38360 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64   ** 1 is treated
38370 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
38380 73 65 20 62 79 20 71 75 65 72 79 53 68 61 72 65  se by queryShare
38390 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
383a0 29 0a 20 20 2a 2a 20 61 6e 64 20 73 65 74 53 68  ).  ** and setSh
383b0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
383c0 63 6b 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63  ck())..  */.  rc
383d0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
383e0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
383f0 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
38400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
38410 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
38420 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
38430 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
38440 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64   }..  assert( id
38450 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=0 && idx<=15 
38460 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  );.  if( pBt->pP
38470 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  age1 ){.    /* T
38480 68 65 20 62 2d 74 72 65 65 20 69 73 20 61 6c 72  he b-tree is alr
38490 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 20 72  eady holding a r
384a0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
384