/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact c618d62fb41642216f8fc5be403c36f32e1b25d6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 38 34 20 32 30 30 38 2f 30  c,v 1.484 2008/0
0190: 37 2f 31 37 20 31 38 3a 33 39 3a 35 38 20 64 72  7/17 18:39:58 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72  eTrace=0;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69 6e  .** A flag to in
0450: 64 69 63 61 74 65 20 77 68 65 74 68 65 72 20 6f  dicate whether o
0460: 72 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61 63  r not shared cac
0470: 68 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 20  he is enabled.  
0480: 41 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74 20  Also,.** a list 
0490: 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  of BtShared obje
04a0: 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c 69  cts that are eli
04b0: 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69 63  gible for partic
04c0: 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73 68  ipation.** in sh
04d0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
04e0: 20 76 61 72 69 61 62 6c 65 73 20 68 61 76 65 20   variables have 
04f0: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0500: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0510: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
0520: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
0530: 6f 20 61 63 63 65 73 73 20 74 68 65 73 65 20 76  o access these v
0540: 61 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20 6d  ariables so we m
0550: 61 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f 62  ake them.** glob
0560: 61 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69 6c  al for test buil
0570: 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ds..*/.#ifdef SQ
0580: 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72  LITE_TEST.BtShar
0590: 65 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72 65  ed *sqlite3Share
05a0: 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a  dCacheList = 0;.
05b0: 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72 65  int sqlite3Share
05c0: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20  dCacheEnabled = 
05d0: 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  0;.#else.static 
05e0: 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74 65  BtShared *sqlite
05f0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
0600: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
0610: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0620: 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  cheEnabled = 0;.
0630: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a  #endif.#endif /*
0640: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
0650: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
0660: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0670: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
0680: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
0690: 69 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65  isable the share
06a0: 64 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65  d pager and sche
06b0: 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a  ma features..**.
06c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
06d0: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e  has no effect on
06e0: 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
06f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
0700: 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61  ** The shared ca
0710: 63 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65  che setting effe
0720: 63 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20  cts only future 
0730: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
0740: 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69  te3_open(), sqli
0750: 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72  te3_open16(), or
0760: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
0770: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
0780: 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
0790: 5f 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c  _cache(int enabl
07a0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68 61  e){.  sqlite3Sha
07b0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
07c0: 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74 75  = enable;.  retu
07d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
07e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46  #endif.../*.** F
07f0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
0800: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
0810: 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
0820: 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20 42 74  Btree*, Pgno, Bt
0830: 43 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b 0a 0a  Cursor*, i64);..
0840: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0850: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0860: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
0870: 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61  unctions queryTa
0880: 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54  bleLock(), lockT
0890: 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63  able() and unloc
08a0: 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a  kAllTables().  *
08b0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
08c0: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
08d0: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
08e0: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
08f0: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0900: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0910: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0920: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0930: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0940: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0950: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0960: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0970: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0980: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0990: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
09a0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
09b0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
09c0: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
09d0: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
09e0: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
09f0: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0a00: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0a10: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  eryTableLock(a,b
0a20: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a30: 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c  #define lockTabl
0a40: 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  e(a,b,c) SQLITE_
0a50: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c  OK.  #define unl
0a60: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a  ockAllTables(a).
0a70: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0a80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0a90: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51  ED_CACHE./*.** Q
0aa0: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62  uery to see if b
0ab0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
0ac0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
0ad0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
0ae0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
0af0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
0b00: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
0b10: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
0b20: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
0b30: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
0b40: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
0b50: 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61  y calling lockTa
0b60: 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51  ble()), or.** SQ
0b70: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
0b80: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
0b90: 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  t queryTableLock
0ba0: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
0bb0: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
0bc0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
0bd0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
0be0: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
0bf0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
0c00: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
0c10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
0c20: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
0c30: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
0c40: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
0c50: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a   p->db!=0 );.  .
0c60: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
0c70: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
0c80: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
0c90: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
0ca0: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
0cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0cc0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
0cd0: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
0ce0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
0cf0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
0d00: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
0d10: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
0d20: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
0d30: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
0d40: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
0d50: 26 26 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  && pBt->pExclusi
0d60: 76 65 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74  ve!=p ){.    ret
0d70: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
0d80: 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
0d90: 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f  s (along with lo
0da0: 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77 68  ckTable()) is wh
0db0: 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ere the ReadUnco
0dc0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a  mmitted flag is.
0dd0: 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e    ** dealt with.
0de0: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
0df0: 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61  s querying for a
0e00: 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74   read-lock and t
0e10: 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20  he flag is.  ** 
0e20: 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e  set, it is uncon
0e30: 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74  ditionally grant
0e40: 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65  ed - even if the
0e50: 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63  re are write-loc
0e60: 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74  ks.  ** on the t
0e70: 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65  able. If a write
0e80: 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74  -lock is request
0e90: 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ed, the ReadUnco
0ea0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a  mmitted flag.  *
0eb0: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
0ec0: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  red..  **.  ** I
0ed0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54  n function lockT
0ee0: 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61  able(), if a rea
0ef0: 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64  d-lock is demand
0f00: 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a  ed and the .  **
0f10: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
0f20: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f   flag is set, no
0f30: 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20   entry is added 
0f40: 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73  to the locks lis
0f50: 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65  t .  ** (BtShare
0f60: 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20  d.pLock)..  **. 
0f70: 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65   ** To summarize
0f80: 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63  : If the ReadUnc
0f90: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
0fa0: 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20   set, then read 
0fb0: 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20  cursors do.  ** 
0fc0: 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65  not create or re
0fd0: 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b  spect table lock
0fe0: 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70  s. The locking p
0ff0: 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a  rocedure for a .
1000: 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f    ** write-curso
1010: 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  r does not chang
1020: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  e..  */.  if( . 
1030: 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c     0==(p->db->fl
1040: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
1050: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a  ncommitted) || .
1060: 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45      eLock==WRITE
1070: 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61  _LOCK ||.    iTa
1080: 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  b==MASTER_ROOT. 
1090: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
10a0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
10b0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
10c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
10d0: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
10e0: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
10f0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a  Table==iTab && .
1100: 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72            (pIter
1110: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c  ->eLock!=eLock |
1120: 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f  | eLock!=READ_LO
1130: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  CK) ){.        r
1140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1150: 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KED;.      }.   
1160: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1170: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1180: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
1190: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
11a0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
11b0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
11c0: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CACHE./*.** Add 
11d0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
11e0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
11f0: 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65  ge iTable to the
1200: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73   shared-btree us
1210: 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68  ed.** by Btree h
1220: 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74  andle p. Paramet
1230: 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er eLock must be
1240: 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43   either READ_LOC
1250: 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c  K or .** WRITE_L
1260: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
1270: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1280: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
1290: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
12a0: 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ly. SQLITE_BUSY 
12b0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  and.** SQLITE_NO
12c0: 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  MEM may also be 
12d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
12e0: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c  tic int lockTabl
12f0: 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
1300: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1310: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1320: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1330: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
1340: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
1350: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
1360: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1370: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1380: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1390: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
13a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
13b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
13c0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
13d0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
13e0: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
13f0: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1400: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1410: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1420: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1430: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
1440: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c  TE_OK==queryTabl
1450: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
1460: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
1470: 20 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63   If the read-unc
1480: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
1490: 20 73 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d   set and a read-
14a0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
14b0: 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65  d,.  ** return e
14c0: 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64  arly without add
14d0: 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  ing an entry to 
14e0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
14f0: 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a  ck list. See.  *
1500: 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e  * comment in fun
1510: 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65  ction queryTable
1520: 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20  Lock() for more 
1530: 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67  info on handling
1540: 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55   .  ** the ReadU
1550: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e  ncommitted flag.
1560: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
1570: 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53   (p->db->flags&S
1580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1590: 69 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28  itted) && .    (
15a0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
15b0: 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21  ) &&.    iTable!
15c0: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
15d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15e0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
15f0: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
1600: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
1610: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
1620: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
1630: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1640: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1650: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1660: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
1670: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
1680: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
1690: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
16a0: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
16b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16d0: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
16e0: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
16f0: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
1700: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
1710: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
1720: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
1730: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
1740: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
1750: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
1760: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
1770: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
1780: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
1790: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
17a0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
17b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
17d0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
17e0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
17f0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
1800: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
1810: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
1820: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
1830: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
1840: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
1850: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
1860: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
1870: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1880: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
1890: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
18a0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
18b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
18c0: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
18d0: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
18e0: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
18f0: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
1900: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
1910: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
1920: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
1930: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
1940: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
1950: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
1960: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
1970: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
1980: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1990: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
19a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
19b0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
19c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
19d0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
19e0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
19f0: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
1a00: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
1a10: 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54  lls to the lockT
1a20: 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64  able().** proced
1a30: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1a40: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a  ee handle p..*/.
1a50: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1a60: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65  ckAllTables(Btre
1a70: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1a80: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1a90: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
1aa0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
1ab0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1ac0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1ad0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1ae0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
1af0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
1b00: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
1b10: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
1b20: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
1b30: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1b40: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d  Bt->pExclusive==
1b50: 30 20 7c 7c 20 70 42 74 2d 3e 70 45 78 63 6c 75  0 || pBt->pExclu
1b60: 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  sive==pLock->pBt
1b70: 72 65 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ree );.    if( p
1b80: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
1b90: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
1ba0: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
1bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1bc0: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
1bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
1be0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
1bf0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
1c00: 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63 6c    if( pBt->pExcl
1c10: 75 73 69 76 65 3d 3d 70 20 29 7b 0a 20 20 20 20  usive==p ){.    
1c20: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
1c30: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
1c40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1c50: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
1c60: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
1c70: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
1c80: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
1c90: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1ca0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66   */../*.** Verif
1cb0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
1cc0: 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20  r holds a mutex 
1cd0: 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a  on the BtShared.
1ce0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1cf0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
1d00: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
1d10: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
1d20: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
1d30: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
1d40: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
1d50: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1d60: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1d70: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
1d80: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1d90: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
1da0: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
1db0: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
1dc0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
1dd0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
1de0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1df0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e00: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1e20: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
1e30: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
1e40: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
1e50: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
1e60: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1e70: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
1e80: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
1e90: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
1ea0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
1eb0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
1ec0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
1ed0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1ee0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
1ef0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1f10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1f20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1f30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
1f40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1f50: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
1f60: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1f70: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  p);.  }.}.#else.
1f80: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
1f90: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1fa0: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
1fb0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1fc0: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e  flowCache(x).#en
1fd0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  dif../*.** Save 
1fe0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
1ff0: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
2000: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
2010: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
2020: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
2030: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
2040: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
2050: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2060: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
2070: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2080: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2090: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
20a0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
20b0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
20c0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
20d0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
20e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
20f0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2100: 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ur) );..  rc = s
2110: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
2120: 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e  ze(pCur, &pCur->
2130: 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nKey);..  /* If 
2140: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65  this is an intKe
2150: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
2160: 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20  e above call to 
2170: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20  BtreeKeySize(). 
2180: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69   ** stores the i
2190: 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43  nteger key in pC
21a0: 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69  ur->nKey. In thi
21b0: 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75  s case this valu
21c0: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  e is.  ** all th
21d0: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  at is required. 
21e0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
21f0: 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f  ur is not open o
2200: 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a  n an intKey.  **
2210: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c   table, then mal
2220: 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e  loc space for an
2230: 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72  d store the pCur
2240: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20  ->nKey bytes of 
2250: 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a  key .  ** data..
2260: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2270: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70  QLITE_OK && 0==p
2280: 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
2290: 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ey){.    void *p
22a0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
22b0: 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  loc(pCur->nKey);
22c0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
22d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22e0: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
22f0: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
2300: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
2310: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2320: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2330: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
2340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2350: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2360: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
2370: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2380: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2390: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
23a0: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50  ssert( !pCur->pP
23b0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  age->intKey || !
23c0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
23d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23e0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
23f0: 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
2400: 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  e);.    pCur->pP
2410: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  age = 0;.    pCu
2420: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2430: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
2440: 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74    }..  invalidat
2450: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
2460: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
2470: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
2480: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2490: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78  f all cursors ex
24a0: 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70 65  cept pExcept ope
24b0: 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a  n on the table .
24c0: 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  ** with root-pag
24d0: 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79  e iRoot. Usually
24e0: 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  , this is called
24f0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
2500: 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69  sor.** pExcept i
2510: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
2520: 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65   the table (Btre
2530: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
2540: 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a  eeInsert())..*/.
2550: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
2560: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
2570: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
2580: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
2590: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
25a0: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
25b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25c0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
25d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25e0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
25f0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
2600: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
2610: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
2620: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
2630: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
2640: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
2650: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
2660: 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74   .        p->eSt
2670: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2680: 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
2690: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
26a0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
26b0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
26c0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
26d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
26e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
26f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2700: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
2710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2720: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
2730: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43  atic void clearC
2740: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2750: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2760: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2770: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2780: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2790: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
27a0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
27b0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
27c0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
27d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
27e0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
27f0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
2800: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
2810: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
2820: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
2830: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2840: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
2850: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
2860: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
2870: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
2880: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
2890: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
28a0: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
28b0: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
28c0: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
28d0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
28e0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
28f0: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
2900: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
2910: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2920: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
2930: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
2940: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
2950: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
2960: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2970: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2980: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
2990: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
29a0: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
29b0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29c0: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
29d0: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
29e0: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
29f0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2a00: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71  VALID;.  rc = sq
2a10: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2a20: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
2a30: 79 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  y, 0, pCur->nKey
2a40: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
2a50: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2a60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2a70: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
2a80: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
2a90: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
2aa0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2ab0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ac0: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2ad0: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2ae0: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
2af0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
2b00: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
2b10: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
2b20: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
2b30: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
2b40: 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  \.         sqlit
2b50: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43 75  e3BtreeRestoreCu
2b60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
2b70: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
2b80: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
2b90: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2ba0: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
2bb0: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
2bc0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a  the position it.
2bd0: 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  ** was last plac
2be0: 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 20 63  ed at.  Cursor c
2bf0: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
2c00: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
2c10: 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20  inting.** at is 
2c20: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
2c30: 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a   under them..**.
2c40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2c50: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
2c60: 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69   code if somethi
2c70: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20  ng goes wrong.  
2c80: 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a  The.** integer *
2c90: 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74  pHasMoved is set
2ca0: 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63   to one if the c
2cb0: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
2cc0: 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f  and 0 if not..*/
2cd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2ce0: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
2cf0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d00: 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b  int *pHasMoved){
2d10: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
2d20: 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
2d30: 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2d40: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d50: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a  *pHasMoved = 1;.
2d60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d70: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
2d80: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d90: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69  LID || pCur->ski
2da0: 70 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61  p!=0 ){.    *pHa
2db0: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  sMoved = 1;.  }e
2dc0: 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  lse{.    *pHasMo
2dd0: 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ved = 0;.  }.  r
2de0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2df0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2e00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e10: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
2e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2e30: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
2e40: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
2e50: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
2e60: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
2e70: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
2e80: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
2e90: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
2ea0: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
2eb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
2ec0: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
2ed0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
2ee0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
2ef0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 2c  PagesPerMapPage,
2f00: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
2f10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2f30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61  >mutex) );.  nPa
2f40: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
2f50: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2f60: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
2f70: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
2f80: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
2f90: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
2fa0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
2fb0: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
2fc0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2fd0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2fe0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
2ff0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
3000: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
3010: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
3020: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
3030: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
3040: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
3050: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
3060: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
3070: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
3080: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
3090: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
30a0: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
30b0: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
30c0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
30d0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
30e0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
30f0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
3100: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
3110: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
3120: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
3130: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
3140: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
3150: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
3160: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3170: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
3180: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
3190: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
31a0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
31b0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
31c0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
31d0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
31e0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
31f0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
3200: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
3210: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3220: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3230: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3240: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
3250: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
3260: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
3270: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
3280: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3290: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
32a0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
32b0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
32c0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
32d0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
32e0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
32f0: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
3300: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
3310: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
3320: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
3330: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
3340: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
3350: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
3360: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
3370: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
3380: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3390: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
33a0: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
33b0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
33c0: 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  SET(pBt, key);. 
33d0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
33e0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
33f0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
3400: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
3410: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
3420: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
3430: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
3440: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
3450: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
3460: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
3470: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
3480: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
3490: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34a0: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
34b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
34d0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
34e0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
34f0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
3500: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
3510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
3520: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
3530: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74  (pDbPage);.  ret
3540: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3550: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
3560: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
3570: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
3580: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
3590: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
35a0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
35b0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
35c0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
35d0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
35e0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
35f0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
3600: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
3610: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3620: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
3630: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
3640: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
3650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3660: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
3670: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
3680: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
3690: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
36a0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
36b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
36c0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
36d0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
36e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
36f0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
3700: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
3710: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
3720: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
3730: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
3740: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
3750: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
3760: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
3770: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
3780: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3790: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
37a0: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
37b0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
37c0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
37d0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
37e0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
37f0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
3800: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
3810: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
3820: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
3830: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
3840: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
3850: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
3860: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42  MAP_PTROFFSET(pB
3870: 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72  t, key);.  asser
3880: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
3890: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
38a0: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
38b0: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
38c0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
38d0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
38e0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
38f0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
3900: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
3910: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
3920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
3930: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
3940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3950: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3960: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
3970: 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  UUM */../*.** Gi
3980: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
3990: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
39a0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
39b0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
39c0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
39d0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
39e0: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
39f0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
3a00: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
3a10: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
3a20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
3a30: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
3a40: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
3a50: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
3a60: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
3a70: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
3a80: 20 69 43 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50   iCell) \.  ((pP
3a90: 61 67 65 29 2d 3e 61 44 61 74 61 20 2b 20 67 65  age)->aData + ge
3aa0: 74 32 62 79 74 65 28 26 28 70 50 61 67 65 29 2d  t2byte(&(pPage)-
3ab0: 3e 61 44 61 74 61 5b 28 70 50 61 67 65 29 2d 3e  >aData[(pPage)->
3ac0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43  cellOffset+2*(iC
3ad0: 65 6c 6c 29 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  ell)]))../*.** T
3ae0: 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c  his a more compl
3af0: 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69  ex version of fi
3b00: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
3b10: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
3b20: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
3b30: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
3b40: 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a    See insert.*/.
3b50: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
3b60: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
3b70: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
3b80: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
3b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3ba0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
3bb0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
3bc0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
3bd0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
3be0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
3bf0: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
3c00: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
3c10: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
3c20: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
3c30: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
3c40: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
3c50: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
3c60: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
3c70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
3c80: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
3c90: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
3ca0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
3cb0: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
3cc0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
3cd0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
3ce0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
3cf0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
3d00: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
3d10: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
3d20: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
3d30: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
3d40: 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65  on.  sqlite3Btre
3d50: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
3d60: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
3d70: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
3d80: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  d argument and s
3d90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3da0: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
3db0: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
3dc0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
3dd0: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
3de0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
3df0: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
3e00: 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43  file, the parseC
3e10: 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20  ell() macro can 
3e20: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
3e30: 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42  d of.** sqlite3B
3e40: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
3e50: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
3e60: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
3e70: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
3e80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
3e90: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3ea0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
3eb0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3ec0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
3ed0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
3ee0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
3ef0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3f00: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
3f10: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
3f20: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
3f30: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
3f40: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
3f50: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
3f60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3f70: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
3f80: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
3f90: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
3fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3fb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
3fc0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
3fd0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
3fe0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3ff0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
4000: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
4010: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
4020: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
4030: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
4040: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
4050: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
4060: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
4070: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
4080: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
4090: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
40a0: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
40b0: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
40c0: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c  nPayload);.  }el
40d0: 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  se{.    nPayload
40e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 66   = 0;.  }.  pInf
40f0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
4100: 6f 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67 65  oad;.  if( pPage
4110: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
4120: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
4130: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a  pCell[n], (u64 *
4140: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
4150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33 32    }else{.    u32
4160: 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   x;.    n += get
4170: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
4180: 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 70 49 6e 66  n], x);.    pInf
4190: 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20  o->nKey = x;.   
41a0: 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a   nPayload += x;.
41b0: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61    }.  pInfo->nPa
41c0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
41d0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  ;.  pInfo->nHead
41e0: 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50  er = n;.  if( nP
41f0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
4200: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
4210: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
4220: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
4230: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
4240: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
4250: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
4260: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
4270: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
4280: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
4290: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
42a0: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
42b0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
42c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
42d0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
42e0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
42f0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
4300: 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   0;.    nSize = 
4310: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
4320: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
4330: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
4340: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
4350: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
4360: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
4370: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
4380: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
4390: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
43a0: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
43b0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
43c0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
43d0: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
43e0: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
43f0: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
4400: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
4410: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
4420: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
4430: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
4440: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
4450: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
4460: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
4470: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
4480: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
4490: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
44a0: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
44b0: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
44c0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
44d0: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
44e0: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
44f0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
4500: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
4510: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
4520: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
4530: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
4540: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
4550: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
4560: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
4570: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
4580: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4590: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
45a0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
45b0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
45c0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
45d0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
45e0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
45f0: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
4600: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
4610: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
4620: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
4630: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
4640: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
4650: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
4660: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
4670: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
4680: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
4690: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
46a0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
46b0: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
46c0: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
46d0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
46e0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
46f0: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
4700: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
4710: 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63  >nLocal = minLoc
4720: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
4730: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
4740: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
4750: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
4760: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
4770: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
4780: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
4790: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
47a0: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71  l, pInfo) \.  sq
47b0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
47c0: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
47d0: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
47e0: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
47f0: 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  fo)).void sqlite
4800: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
4810: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
4820: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
4830: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
4840: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
4850: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
4860: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
4870: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
4880: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
4890: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
48a0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
48b0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
48c0: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
48d0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
48e0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
48f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
4900: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
4910: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
4920: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
4930: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
4940: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
4950: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
4960: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
4970: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
4980: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
4990: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
49a0: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
49b0: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
49c0: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
49d0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
49e0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
49f0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
4a00: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
4a10: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
4a20: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
4a30: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4a40: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
4a50: 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   iCell, &info);.
4a60: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
4a70: 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74  ize;.}.#endif.st
4a80: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
4a90: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
4aa0: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
4ab0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
4ac0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4ad0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
4ae0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
4af0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
4b00: 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64  .nSize;.}..#ifnd
4b10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4b20: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
4b30: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
4b40: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
4b50: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
4b60: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
4b70: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
4b80: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
4b90: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
4ba0: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
4bb0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
4bc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
4bd0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
4be0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
4bf0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  8 *pCell){.  Cel
4c00: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73  lInfo info;.  as
4c10: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
4c20: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4c30: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
4c40: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
4c50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
4c60: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
4c70: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
4c80: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
4c90: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69  load );.  if( (i
4ca0: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
4cb0: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
4cc0: 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
4cd0: 61 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  al ){.    Pgno o
4ce0: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
4cf0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
4d00: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75  flow]);.    retu
4d10: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
4d20: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
4d30: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
4d40: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
4d50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4d60: 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49  TE_OK;.}./*.** I
4d70: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  f the cell with 
4d80: 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70  index iCell on p
4d90: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
4da0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
4db0: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
4dc0: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
4dd0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
4de0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
4df0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
4e00: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
4e10: 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  t ptrmapPutOvfl(
4e20: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4e30: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
4e40: 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72   *pCell;.  asser
4e50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4e60: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
4e70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43  ->mutex) );.  pC
4e80: 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ell = findOverfl
4e90: 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  owCell(pPage, iC
4ea0: 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ell);.  return p
4eb0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
4ec0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d  pPage, pCell);.}
4ed0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4ee0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
4ef0: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
4f00: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
4f10: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
4f20: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
4f30: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
4f40: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
4f50: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
4f60: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
4f70: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
4f80: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
4f90: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
4fa0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
4fb0: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
4fc0: 69 63 20 76 6f 69 64 20 64 65 66 72 61 67 6d 65  ic void defragme
4fd0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
4fe0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
5010: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
5020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5030: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5040: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
5050: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5070: 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
5080: 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c  t byte after cel
5090: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
50a0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
50d0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
50e0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5100: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
5110: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
5120: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
5130: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
5140: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
5150: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
5160: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5170: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
5180: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
5190: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
51a0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
51b0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
51c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
51d0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
51e0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
51f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5200: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
5210: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
5220: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5230: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
5240: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
5250: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
5260: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
5270: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
5280: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
5290: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
52a0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
52b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
52c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
52d0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
52e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
52f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
5300: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
5310: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
5320: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
5330: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
5340: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5350: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
5360: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
5370: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
5380: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
5390: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
53a0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
53b0: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
53c0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
53d0: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
53e0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
53f0: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
5400: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
5410: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
5420: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
5430: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
5440: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
5450: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62  >usableSize;.  b
5460: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
5470: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
5480: 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d  emcpy(&temp[brk]
5490: 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73  , &data[brk], us
54a0: 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b  ableSize - brk);
54b0: 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53  .  brk = usableS
54c0: 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ize;.  for(i=0; 
54d0: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
54e0: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20     u8 *pAddr;   
54f0: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65    /* The i-th ce
5500: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
5510: 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b    pAddr = &data[
5520: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32  cellOffset + i*2
5530: 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ];.    pc = get2
5540: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
5550: 20 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67   assert( pc<pPag
5560: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
5570: 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  ze );.    size =
5580: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
5590: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
55a0: 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b      brk -= size;
55b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
55c0: 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  a[brk], &temp[pc
55d0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
55e0: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72  t2byte(pAddr, br
55f0: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
5600: 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65  ( brk>=cellOffse
5610: 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  t+2*nCell );.  p
5620: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
5630: 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61  r+5], brk);.  da
5640: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
5650: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
5660: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
5670: 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65  = 0;.  addr = ce
5680: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
5690: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
56a0: 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61  [addr], 0, brk-a
56b0: 64 64 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ddr);.}../*.** A
56c0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
56d0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20  tes of space on 
56e0: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  a page..**.** Re
56f0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
5700: 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
5710: 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  [] of the first 
5720: 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  byte of.** the n
5730: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ew allocation.  
5740: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
5750: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
5760: 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a 20 73 70   is enough.** sp
5770: 61 63 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ace.  This routi
5780: 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 66 61  ne will never fa
5790: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  il..**.** If the
57a0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
57b0: 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70  Bytes of free sp
57c0: 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  ace but does not
57d0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74   contain.** nByt
57e0: 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  es of contiguous
57f0: 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65   free space, the
5800: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
5810: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
5820: 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e  calls defragemen
5830: 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f  tPage() to conso
5840: 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20  lidate all free 
5850: 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a  space before .**
5860: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
5870: 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74  new chunk..*/.st
5880: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
5890: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
58a0: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
58b0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
58c0: 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69  c, hdr;.  int si
58d0: 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b  ze;.  int nFrag;
58e0: 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e  .  int top;.  in
58f0: 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63  t nCell;.  int c
5900: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73  ellOffset;.  uns
5910: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
5920: 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50  ;.  .  data = pP
5930: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73  age->aData;.  as
5940: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
5950: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
5960: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
5970: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5980: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
5990: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
59a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
59b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
59c0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
59d0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
59e0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
59f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5a00: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
5a10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5a20: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
5a30: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
5a40: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72   -= nByte;.  hdr
5a50: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
5a60: 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20  set;..  nFrag = 
5a70: 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69  data[hdr+7];.  i
5a80: 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20  f( nFrag<60 ){. 
5a90: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
5aa0: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
5ab0: 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67  g for a slot big
5ac0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
5ad0: 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70  fy the.    ** sp
5ae0: 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a  ace request. */.
5af0: 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31      addr = hdr+1
5b00: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 63  ;.    while( (pc
5b10: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5b20: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
5b30: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
5b40: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
5b50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
5b60: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
5b70: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79      if( size<nBy
5b80: 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  te+4 ){.        
5b90: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
5ba0: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
5bb0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
5bc0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72  ata[hdr+7] = nFr
5bd0: 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  ag + size - nByt
5be0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e;.          ret
5bf0: 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20  urn pc;.        
5c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5c10: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5c20: 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74  pc+2], size-nByt
5c30: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
5c40: 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d  turn pc + size -
5c50: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
5c60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5c70: 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d  addr = pc;.    }
5c80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
5c90: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
5ca0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
5cb0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
5cc0: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
5cd0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
5ce0: 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20  ent area..  */. 
5cf0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
5d00: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
5d10: 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
5d20: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
5d30: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
5d40: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
5d50: 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d  t;.  if( nFrag>=
5d60: 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74  60 || cellOffset
5d70: 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70   + 2*nCell > top
5d80: 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20   - nByte ){.    
5d90: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
5da0: 50 61 67 65 29 3b 0a 20 20 20 20 74 6f 70 20 3d  Page);.    top =
5db0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5dc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74  hdr+5]);.  }.  t
5dd0: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61  op -= nByte;.  a
5de0: 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65  ssert( cellOffse
5df0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74  t + 2*nCell <= t
5e00: 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  op );.  put2byte
5e10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5e20: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
5e30: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
5e40: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
5e50: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
5e60: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
5e70: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
5e80: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
5e90: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
5ea0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
5eb0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
5ec0: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
5ed0: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
5ee0: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
5ef0: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
5f00: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
5f10: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
5f20: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
5f30: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
5f40: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
5f50: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53  tatic void freeS
5f60: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
5f70: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
5f80: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
5f90: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
5fa0: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
5fb0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
5fc0: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
5fd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
5fe0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5ff0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
6000: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
6010: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
6020: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
6030: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
6040: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
6050: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
6060: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
6070: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
6080: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
6090: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
60a0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
60b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
60c0: 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20  ert( size>=0 ); 
60d0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
60e0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a  l size is 4 */..
60f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
6100: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
6110: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
6120: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
6130: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
6140: 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  he SECURE_DELETE
6150: 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73   .  ** option is
6160: 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
6170: 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65  ile-time */.  me
6180: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
6190: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e  ], 0, size);.#en
61a0: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
61b0: 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74  e space back int
61c0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
61d0: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
61e0: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
61f0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
6200: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
6210: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
6220: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6230: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
6240: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
6250: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6260: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
6270: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
6280: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6290: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64  >addr );.    add
62a0: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a  r = pbegin;.  }.
62b0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
62c0: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
62d0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
62e0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
62f0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
6300: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
6310: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
6320: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
6330: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
6340: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
6350: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
6360: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
6370: 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a  >nFree += size;.
6380: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
6390: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
63a0: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
63b0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
63c0: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
63d0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
63e0: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
63f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
6400: 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61  xt, psize;.    a
6410: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
6420: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
6430: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
6440: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6450: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
6460: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6470: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
6480: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
6490: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
64a0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
64b0: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
64c0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
64d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
64e0: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
64f0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
6500: 20 20 20 61 73 73 65 72 74 28 20 66 72 61 67 3c     assert( frag<
6510: 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  =data[pPage->hdr
6520: 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20  Offset+7] );.   
6530: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
6540: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66  drOffset+7] -= f
6550: 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62  rag;.      put2b
6560: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6570: 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  ], get2byte(&dat
6580: 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20  a[pnext]));.    
6590: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
65a0: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78  [pbegin+2], pnex
65b0: 74 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  t+get2byte(&data
65c0: 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69  [pnext+2])-pbegi
65d0: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
65e0: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
65f0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
6600: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
6610: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
6620: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
6630: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
6640: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
6650: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
6660: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
6670: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
6680: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
6690: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
66a0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
66b0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
66c0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
66d0: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
66e0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
66f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
6700: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
6710: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
6720: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
6730: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20  a[pbegin+2]));. 
6740: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f   }.}../*.** Deco
6750: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
6760: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
6770: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
6780: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
6790: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
67a0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
67b0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
67c0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
67d0: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
67e0: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
67f0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
6800: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
6810: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
6820: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
6830: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
6840: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
6850: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
6860: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
6870: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
6880: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
6890: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
68a0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
68b0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
68c0: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
68d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
68e0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
68f0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
6900: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
6910: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
6920: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
6930: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
6940: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
6950: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
6960: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
6970: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6980: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6990: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
69a0: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
69b0: 61 66 20 3d 20 66 6c 61 67 42 79 74 65 3e 3e 33  af = flagByte>>3
69c0: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
69d0: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
69e0: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
69f0: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
6a00: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
6a10: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
6a20: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
6a30: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
6a40: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
6a50: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
6a60: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
6a70: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70  ntKey = 1;.    p
6a80: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
6a90: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
6aa0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
6ab0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
6ac0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
6ad0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
6ae0: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
6af0: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
6b00: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70  ERODATA ){.    p
6b10: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
6b20: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
6b30: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50  Data = 0;.    pP
6b40: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
6b50: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
6b60: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
6b70: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
6b80: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
6b90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6ba0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
6bb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6bc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
6bd0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
6be0: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
6bf0: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
6c00: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ock..**.** The p
6c10: 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
6c20: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
6c30: 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
6c40: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 68  e which.** is th
6c50: 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
6c60: 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69 74 69  page being initi
6c70: 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f  alized.  The roo
6c80: 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65 20  t of a.** BTree 
6c90: 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e  has no parent an
6ca0: 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20 70 61  d so for that pa
6cb0: 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c  ge, pParent==NUL
6cc0: 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
6cd0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
6ce0: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
6cf0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
6d00: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
6d10: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
6d20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
6d30: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
6d40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
6d50: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
6d60: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
6d70: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
6d80: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
6d90: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
6da0: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
6db0: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
6dc0: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
6dd0: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
6de0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6df0: 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20 20 4d  reeInitPage(.  M
6e00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
6e10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
6e20: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
6e30: 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  zed */.  MemPage
6e40: 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20 20   *pParent       
6e50: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20  /* The parent.  
6e60: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6e70: 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  .){.  int pc;   
6e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
6e90: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
6ea0: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
6eb0: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  >aData[] */.  in
6ec0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
6ed0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
6ee0: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
6ef0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
6f00: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
6f10: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
6f20: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
6f30: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
6f40: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
6f50: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
6f60: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
6f70: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
6f80: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
6f90: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
6fa0: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
6fb0: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
6fc0: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
6fd0: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
6fe0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
6ff0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
7000: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
7010: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
7020: 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
7030: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
7040: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
7050: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
7060: 20 61 72 65 61 20 2a 2f 0a 20 20 75 38 20 2a 70   area */.  u8 *p
7070: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Off;          /*
7080: 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74   Iterator used t
7090: 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c  o check all cell
70a0: 20 6f 66 66 73 65 74 73 20 61 72 65 20 69 6e 20   offsets are in 
70b0: 72 61 6e 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70  range */.  u8 *p
70c0: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
70d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 64 20   Pointer to end 
70e0: 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61  of cell offset a
70f0: 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 6d 61 73  rray */.  u8 mas
7100: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k;           /* 
7110: 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74 68 61  Mask of bits tha
7120: 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 20 69  t must be zero i
7130: 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66  n MSB of cell of
7140: 66 73 65 74 73 20 2a 2f 0a 0a 20 20 70 42 74 20  fsets */..  pBt 
7150: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
7160: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
7170: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
7180: 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  ent==0 || pParen
7190: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
71a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
71b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
71c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
71d0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
71e0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
71f0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
7200: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
7210: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
7220: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
7230: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
7240: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7250: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
7260: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7270: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
7280: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 70 50  age) );.  if( pP
7290: 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50  age->pParent!=pP
72a0: 61 72 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d  arent && (pPage-
72b0: 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70  >pParent!=0 || p
72c0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b  Page->isInit) ){
72d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65  .    /* The pare
72e0: 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e  nt page should n
72f0: 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65  ever change unle
7300: 73 73 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  ss the file is c
7310: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
7320: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7330: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7340: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
7350: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
7360: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
7370: 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26  e->pParent==0 &&
7380: 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20   pParent!=0 ){. 
7390: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
73a0: 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20  t = pParent;.   
73b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
73c0: 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
73d0: 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20  e);.  }.  hdr = 
73e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
73f0: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
7400: 2d 3e 61 44 61 74 61 3b 0a 20 20 69 66 28 20 64  ->aData;.  if( d
7410: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
7420: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
7430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7440: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 50 61  RUPT_BKPT;.  pPa
7450: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
7460: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  0;.  pPage->idxS
7470: 68 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61 62  hift = 0;.  usab
7480: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
7490: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  ableSize;.  pPag
74a0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
74b0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
74c0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
74d0: 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67  >leaf;.  top = g
74e0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
74f0: 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e  r+5]);.  pPage->
7500: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
7510: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
7520: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
7530: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
7540: 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  ){.    /* To man
7550: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
7560: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
7570: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
7580: 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  rupt */.    retu
7590: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
75a0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
75b0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
75c0: 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20  0 && pParent!=0 
75d0: 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  && pParent->pgno
75e0: 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  !=1 ){.    /* Al
75f0: 6c 20 70 61 67 65 73 20 6d 75 73 74 20 68 61 76  l pages must hav
7600: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
7610: 65 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72 20  ell, except for 
7620: 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20 20  root pages */.  
7630: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7640: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7650: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
7660: 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
7670: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
7680: 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62   */.  pc = get2b
7690: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
76a0: 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74  );.  nFree = dat
76b0: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d  a[hdr+7] + top -
76c0: 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32   (cellOffset + 2
76d0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pPage->nCell);.
76e0: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
76f0: 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20 73  .    int next, s
7700: 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3e  ize;.    if( pc>
7710: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a  usableSize-4 ){.
7720: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
7730: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70  ock is off the p
7740: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  age */.      ret
7750: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7760: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
7770: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
7780: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
7790: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
77a0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
77b0: 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30  ;.    if( next>0
77c0: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
77d0: 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  e+3 ){.      /* 
77e0: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
77f0: 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67   be in accending
7800: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
7810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7820: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
7830: 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20   }.    nFree += 
7840: 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e  size;.    pc = n
7850: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ext;.  }.  pPage
7860: 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b  ->nFree = nFree;
7870: 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73  .  if( nFree>=us
7880: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
7890: 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63 61  /* Free space ca
78a0: 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61  nnot exceed tota
78b0: 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  l page size */. 
78c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
78d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
78e0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
78f0: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66  that all the off
7900: 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  sets in the cell
7910: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72   offset array ar
7920: 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
7930: 2a 2f 0a 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28  */.  mask = ~(((
7940: 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
7950: 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 70 45 6e  e>>8))-1);.  pEn
7960: 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  d = &data[cellOf
7970: 66 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43  fset + pPage->nC
7980: 65 6c 6c 2a 32 5d 3b 0a 20 20 66 6f 72 28 70 4f  ell*2];.  for(pO
7990: 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  ff=&data[cellOff
79a0: 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64  set]; pOff!=pEnd
79b0: 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61   && !((*pOff)&ma
79c0: 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20  sk); pOff+=2);. 
79d0: 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20   if( pOff!=pEnd 
79e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
79f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7a00: 54 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 2d  T;.  }..  pPage-
7a10: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72  >isInit = 1;.  r
7a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
7a40: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
7a50: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
7a60: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
7a70: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
7a80: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
7a90: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
7aa0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7ab0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
7ac0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
7ad0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7ae0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
7af0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
7b00: 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  .  int hdr = pPa
7b10: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
7b20: 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61   int first;..  a
7b30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7b40: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
7b50: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
7b60: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
7b70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7b80: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
7b90: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
7ba0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
7bb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7bc0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
7bd0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7be0: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
7bf0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
7c00: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
7c10: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7c20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7c30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
7c40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d 65 6d 73  mutex) );.  mems
7c50: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
7c60: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
7c70: 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61 74 61  e - hdr);.  data
7c80: 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20  [hdr] = flags;. 
7c90: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
7ca0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
7cb0: 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65  _LEAF)==0);.  me
7cc0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
7cd0: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
7ce0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
7cf0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
7d00: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
7d10: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
7d20: 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73  >nFree = pBt->us
7d30: 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
7d40: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
7d50: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
7d60: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
7d70: 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65  t = hdr;.  pPage
7d80: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
7d90: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  irst;.  pPage->n
7da0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7db0: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
7dc0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  = 0;.  pPage->nC
7dd0: 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
7de0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
7df0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
7e00: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
7e10: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
7e20: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
7e30: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
7e40: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
7e50: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
7e60: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
7e70: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
7e80: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
7e90: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
7ea0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
7eb0: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
7ec0: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
7ed0: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
7ee0: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
7ef0: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
7f00: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
7f10: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
7f20: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
7f30: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
7f40: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
7f50: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
7f60: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
7f70: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
7f80: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
7f90: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
7fa0: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
7fb0: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
7fc0: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
7fd0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
7fe0: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20  3BtreeGetPage(. 
7ff0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
8000: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
8010: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
8020: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
8030: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
8040: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
8050: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
8060: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
8070: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
8080: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
8090: 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
80a0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c       /* Do not l
80b0: 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
80c0: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
80d0: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
80e0: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44 62 50  ge *pPage;.  DbP
80f0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
8100: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8110: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
8120: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
8130: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
8140: 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
8150: 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
8160: 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43  **)&pDbPage, noC
8170: 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  ontent);.  if( r
8180: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
8190: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
81a0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
81b0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
81c0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
81d0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
81e0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
81f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
8200: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
8210: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
8220: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
8230: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
8240: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
8250: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
8260: 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65  0 : 0;.  *ppPage
8270: 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75   = pPage;.  retu
8280: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8290: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
82a0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
82b0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
82c0: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
82d0: 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63  e.** is just a c
82e0: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
82f0: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
8300: 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  te calls to.** s
8310: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
8320: 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ge() and sqlite3
8330: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  BtreeInitPage().
8340: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
8350: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
8360: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
8370: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8380: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
8390: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
83a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
83b0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
83c0: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
83d0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
83e0: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
83f0: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
8400: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
8410: 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  ent     /* Paren
8420: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
8430: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
8440: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8450: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
8460: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
8470: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
8480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8490: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a  RUPT_BKPT; .  }.
84a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
84b0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
84c0: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  pgno, ppPage, 0)
84d0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
84e0: 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67  TE_OK && (*ppPag
84f0: 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
8500: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8510: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a  3BtreeInitPage(*
8520: 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  ppPage, pParent)
8530: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8540: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8550: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
8560: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
8570: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Page = 0;.    }.
8580: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
85a0: 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
85b0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
85c0: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
85d0: 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
85e0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
85f0: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
8600: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
8610: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
8620: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
8630: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8640: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
8650: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8660: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
8670: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
8680: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
8690: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
86a0: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20  id*)pPage );.   
86b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
86c0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
86d0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
86e0: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
86f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8700: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8710: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8720: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
8730: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
8740: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
8750: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8760: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
8770: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
8780: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
8790: 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72  e.** reaches zer
87a0: 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75  o.  We need to u
87b0: 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74  nref the pParent
87c0: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68   pointer when th
87d0: 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a  at.** happens..*
87e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
87f0: 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50  geDestructor(DbP
8800: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8810: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8820: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
8830: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
8840: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
8850: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
8860: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
8870: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
8880: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
8890: 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  sInit==0 || sqli
88a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
88b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
88c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
88d0: 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
88e0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
88f0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
8900: 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nt;.    assert( 
8910: 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 50  pParent->pBt==pP
8920: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
8930: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
8940: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
8950: 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
8960: 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  }.  pPage->isIni
8970: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
8980: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
8990: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
89a0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
89b0: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
89c0: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
89d0: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
89e0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
89f0: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
8a00: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
8a10: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
8a20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
8a30: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
8a40: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
8a50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8a60: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
8a70: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
8a80: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
8a90: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
8aa0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
8ab0: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
8ac0: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
8ad0: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
8ae0: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
8af0: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
8b00: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
8b10: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
8b20: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
8b30: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
8b40: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
8b50: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
8b60: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
8b70: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
8b80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8b90: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8ba0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
8bb0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
8bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
8bd0: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
8be0: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
8bf0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
8c00: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
8c10: 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
8c20: 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
8c30: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
8c40: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
8c50: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
8c60: 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  n){.  BtShared *
8c70: 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a  pBt = (BtShared*
8c80: 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  )pArg;.  assert(
8c90: 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73   pBt->db );.  as
8ca0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8cb0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62  tex_held(pBt->db
8cc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
8cd0: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f  turn sqlite3Invo
8ce0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70  keBusyHandler(&p
8cf0: 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64  Bt->db->busyHand
8d00: 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ler);.}../*.** O
8d10: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
8d20: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
8d30: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
8d40: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
8d50: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
8d60: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
8d70: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
8d80: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
8d90: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
8da0: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
8db0: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
8dc0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
8dd0: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
8de0: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
8df0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a   called..** If z
8e00: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
8e10: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
8e20: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8e30: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
8e40: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
8e50: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
8e60: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
8e70: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8e80: 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f  3BtreeOpen(.  co
8e90: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
8ea0: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
8eb0: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
8ec0: 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
8ed0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
8ee0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
8ef0: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
8f00: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
8f10: 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
8f20: 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
8f30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
8f40: 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
8f50: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
8f60: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
8f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
8f80: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
8f90: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
8fa0: 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
8fb0: 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
8fc0: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
8fd0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
8fe0: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
8ff0: 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73  /* The VFS to us
9000: 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65  e for this btree
9010: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
9020: 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  pBt = 0;      /*
9030: 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
9040: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
9050: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9070: 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
9080: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
9090: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
90a0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e 73 69  nReserve;.  unsi
90b0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
90c0: 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20  der[100];..  /* 
90d0: 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
90e0: 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
90f0: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9100: 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
9110: 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
9120: 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
9130: 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f  base. This symbo
9140: 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  l is only requir
9150: 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65  ed if.  ** eithe
9160: 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d  r of the shared-
9170: 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75  data or autovacu
9180: 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20  um features are 
9190: 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69  compiled .  ** i
91a0: 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e  nto the library.
91b0: 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
91c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
91d0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20  HARED_CACHE) || 
91e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
91f0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29  OMIT_AUTOVACUUM)
9200: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
9210: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
9220: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
9230: 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73  emdb = 0;.  #els
9240: 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  e.    const int 
9250: 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e  isMemdb = zFilen
9260: 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a  ame && !strcmp(z
9270: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
9280: 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a  ry:");.  #endif.
9290: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
92a0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
92b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
92c0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
92d0: 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20  x) );..  pVfs = 
92e0: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20  db->pVfs;.  p = 
92f0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
9300: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
9310: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
9320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9330: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
9340: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
9350: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
9360: 64 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  db;..#if !define
9370: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
9380: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
9390: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
93a0: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
93b0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
93c0: 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
93d0: 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
93e0: 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
93f0: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
9400: 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
9410: 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
9420: 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
9430: 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20  if( isMemdb==0. 
9440: 20 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20    && (db->flags 
9450: 26 20 53 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d  & SQLITE_Vtab)==
9460: 30 0a 20 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d  0.   && zFilenam
9470: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
9480: 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ].  ){.    if( s
9490: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
94a0: 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
94b0: 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
94c0: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
94d0: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
94e0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
94f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
9500: 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  loc(nFullPathnam
9510: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9520: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
9530: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73  ared;.      p->s
9540: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
9550: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
9560: 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63  SQLITE_SharedCac
9570: 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  he;.      if( !z
9580: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
9590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
95a0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
95b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
95c0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
95d0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
95e0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
95f0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
9600: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
9610: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
9620: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
9630: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
9640: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
9650: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
9660: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9670: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
9680: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
9690: 42 74 3d 73 71 6c 69 74 65 33 53 68 61 72 65 64  Bt=sqlite3Shared
96a0: 43 61 63 68 65 4c 69 73 74 3b 20 70 42 74 3b 20  CacheList; pBt; 
96b0: 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
96c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
96d0: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
96e0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
96f0: 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
9700: 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
9710: 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
9720: 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
9730: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
9740: 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
9750: 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
9760: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
9770: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
9780: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
9790: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
97a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
97b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
97c0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
97d0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
97e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
97f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
9800: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
9810: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
9820: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
9830: 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
9840: 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
9850: 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
9860: 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
9870: 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
9880: 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
9890: 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
98a0: 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
98b0: 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
98c0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
98d0: 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
98e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
98f0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
9900: 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
9910: 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
9920: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
9930: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
9940: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
9950: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
9960: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
9970: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
9980: 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
9990: 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
99a0: 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
99b0: 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
99c0: 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
99d0: 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
99e0: 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
99f0: 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
9a00: 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
9a10: 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
9a20: 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
9a30: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
9a40: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9a50: 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (i64)==8 || size
9a60: 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(i64)==4 );.  
9a70: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9a80: 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (u64)==8 || size
9a90: 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(u64)==4 );.  
9aa0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9ab0: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u32)==4 );.    
9ac0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
9ad0: 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73  16)==2 );.    as
9ae0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e  sert( sizeof(Pgn
9af0: 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20  o)==4 );.  .    
9b00: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  pBt = sqlite3Mal
9b10: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
9b20: 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  *pBt) );.    if(
9b30: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pBt==0 ){.     
9b40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
9b50: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  EM;.      goto b
9b60: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
9b70: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 62 75     }.    pBt->bu
9b80: 73 79 48 64 72 2e 78 46 75 6e 63 20 3d 20 73 71  syHdr.xFunc = sq
9b90: 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65  lite3BtreeInvoke
9ba0: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
9bb0: 20 70 42 74 2d 3e 62 75 73 79 48 64 72 2e 70 41   pBt->busyHdr.pA
9bc0: 72 67 20 3d 20 70 42 74 3b 0a 20 20 20 20 72 63  rg = pBt;.    rc
9bd0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
9be0: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
9bf0: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
9c00: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
9c20: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
9c30: 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  vfsFlags);.    i
9c40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9c50: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
9c60: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
9c70: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
9c80: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
9c90: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
9ca0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
9cb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9cc0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
9cd0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
9ce0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
9cf0: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
9d00: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
9d10: 26 70 42 74 2d 3e 62 75 73 79 48 64 72 29 3b 0a  &pBt->busyHdr);.
9d20: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
9d30: 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  ;.  .    sqlite3
9d40: 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
9d50: 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  or(pBt->pPager, 
9d60: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 29 3b  pageDestructor);
9d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
9d80: 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74  rSetReiniter(pBt
9d90: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
9da0: 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e  init);.    pBt->
9db0: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
9dc0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
9dd0: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
9de0: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
9df0: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
9e00: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
9e10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67  Bt->pageSize = g
9e20: 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64  et2byte(&zDbHead
9e30: 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  er[16]);.    if(
9e40: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
9e50: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
9e60: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
9e70: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
9e80: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
9e90: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
9ea0: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
9eb0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
9ec0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
9ed0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
9ee0: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
9ef0: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
9f00: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9f10: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
9f20: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
9f30: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
9f40: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
9f50: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
9f60: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
9f70: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
9f80: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
9f90: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
9fa0: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
9fb0: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
9fc0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
9fd0: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
9fe0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
9ff0: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
a000: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
a010: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
a020: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
a030: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
a040: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
a050: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
a060: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
a070: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
a080: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
a090: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a0a0: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
a0b0: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
a0c0: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
a0d0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
a0e0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
a0f0: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
a100: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
a110: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
a120: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
a130: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
a140: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a150: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
a160: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a170: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
a180: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
a190: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
a1a0: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
a1b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
a1c0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
a1d0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
a1e0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
a1f0: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
a200: 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
a210: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
a220: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
a230: 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
a240: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
a250: 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  }.    pBt->usabl
a260: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
a270: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
a280: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
a290: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
a2a0: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
a2b0: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
a2c0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20  pageSize */.    
a2d0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
a2e0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
a2f0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
a300: 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64  ize);.   .#if !d
a310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a320: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
a330: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
a340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
a350: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
a360: 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
a370: 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
a380: 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
a390: 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
a3a0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
a3b0: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  rable ){.      s
a3c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
a3d0: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
a3e0: 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
a3f0: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
a400: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
a410: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
a420: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
a430: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
a440: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
a450: 26 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  & sqlite3Config.
a460: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
a470: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
a480: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
a490: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a4a0: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
a4b0: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
a4c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a4d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
a4e0: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
a4f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
a500: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
a510: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
a520: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a530: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a540: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
a550: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
a560: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 73    pBt->pNext = s
a570: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
a580: 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  eList;.      sql
a590: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
a5a0: 69 73 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  ist = pBt;.     
a5b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a5c0: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
a5d0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
a5e0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
a5f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
a600: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
a610: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a620: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
a630: 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
a640: 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
a650: 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
a660: 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
a670: 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
a680: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
a690: 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
a6a0: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
a6b0: 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
a6c0: 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
a6d0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
a6e0: 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
a6f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
a700: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
a710: 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
a720: 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
a730: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
a740: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
a750: 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
a760: 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
a770: 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
a780: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
a790: 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
a7a0: 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
a7b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
a7c0: 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
a7d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
a7e0: 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
a7f0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
a800: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
a810: 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
a820: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a830: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
a840: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
a850: 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
a860: 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
a870: 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
a880: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
a890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a8a0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
a8b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
a8c0: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
a8d0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
a8e0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
a8f0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
a900: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
a910: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a920: 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
a930: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
a940: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a950: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a960: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
a970: 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
a980: 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
a990: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a9a0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
a9b0: 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
a9c0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
a9d0: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
a9e0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
a9f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
aa00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
aa10: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
aa20: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ee = 0;.  }.  re
aa30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
aa40: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
aa50: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
aa60: 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
aa70: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
aa80: 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
aa90: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
aaa0: 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
aab0: 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
aac0: 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
aad0: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
aae0: 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
aaf0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
ab00: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
ab10: 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
ab20: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
ab30: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
ab40: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
ab50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ab60: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
ab70: 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  E.  sqlite3_mute
ab80: 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74  x *pMaster;.  Bt
ab90: 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
aba0: 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
abb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
abc0: 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
abd0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
abe0: 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71  ;.  pMaster = sq
abf0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
ac00: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
ac10: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
ac20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ac30: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
ac40: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
ac50: 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
ac60: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
ac70: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
ac80: 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73  ==pBt ){.      s
ac90: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
aca0: 65 4c 69 73 74 20 3d 20 70 42 74 2d 3e 70 4e 65  eList = pBt->pNe
acb0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
acc0: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
acd0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
ace0: 69 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ist;.      while
acf0: 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
ad00: 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
ad10: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
ad20: 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
ad30: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
ad40: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
ad50: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
ad60: 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
ad70: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
ad80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
ad90: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
ada0: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
adb0: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
adc0: 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
add0: 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
ade0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
adf0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
ae00: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
ae10: 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
ae20: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
ae30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
ae40: 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
ae50: 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
ae60: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
ae70: 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
ae80: 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  Bt) bytes..*/.st
ae90: 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
aea0: 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
aeb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
aec0: 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
aed0: 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
aee0: 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
aef0: 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
af00: 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
af10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
af20: 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
af30: 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
af40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
af50: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
af60: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
af70: 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42  ite3PageFree( pB
af80: 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
af90: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
afa0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
afb0: 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
afc0: 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
afd0: 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
afe0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
aff0: 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
b000: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
b010: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
b020: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
b030: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
b040: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
b050: 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
b060: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
b070: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b080: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
b090: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
b0a0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
b0b0: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
b0c0: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
b0d0: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
b0e0: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
b0f0: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
b100: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
b110: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
b120: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
b130: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b140: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
b150: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
b160: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
b170: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
b180: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
b190: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
b1a0: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
b1b0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b1c0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
b1d0: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
b1e0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
b1f0: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
b200: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
b210: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
b220: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b230: 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
b240: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
b250: 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
b260: 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
b270: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
b280: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
b290: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
b2a0: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
b2b0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
b2c0: 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
b2d0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
b2e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b2f0: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
b300: 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
b310: 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
b320: 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
b330: 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
b340: 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
b350: 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
b360: 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
b370: 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
b380: 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
b390: 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
b3a0: 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
b3b0: 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
b3c0: 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
b3d0: 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
b3e0: 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
b3f0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
b400: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
b410: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
b420: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
b430: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
b440: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
b450: 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
b460: 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
b470: 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
b480: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
b490: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
b4a0: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
b4b0: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
b4c0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
b4d0: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
b4e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b4f0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
b500: 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
b510: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
b520: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
b530: 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
b540: 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
b550: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
b560: 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
b570: 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
b580: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
b590: 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
b5a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
b5b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b5c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
b5d0: 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
b5e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
b5f0: 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
b600: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
b610: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
b620: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
b630: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
b640: 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
b650: 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
b660: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
b670: 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
b680: 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
b690: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
b6a0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
b6b0: 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
b6c0: 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
b6d0: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
b6e0: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
b6f0: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
b700: 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
b710: 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
b720: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
b730: 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
b740: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
b750: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
b760: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
b770: 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
b780: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
b790: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
b7a0: 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
b7b0: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
b7c0: 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
b7d0: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
b7e0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
b7f0: 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
b800: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
b810: 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
b820: 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
b830: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
b840: 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
b850: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
b860: 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
b870: 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
b880: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b890: 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
b8a0: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
b8b0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
b8c0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
b8d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b8e0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
b8f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
b900: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
b910: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
b920: 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
b930: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
b940: 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
b950: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
b960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
b980: 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
b990: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
b9a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
b9b0: 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
b9c0: 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
b9d0: 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
b9e0: 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
b9f0: 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
ba00: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
ba10: 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
ba20: 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
ba30: 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
ba40: 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
ba50: 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
ba60: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
ba70: 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
ba80: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
ba90: 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
baa0: 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
bab0: 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
bac0: 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
bad0: 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
bae0: 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
baf0: 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
bb00: 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
bb10: 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
bb20: 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
bb30: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
bb40: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
bb50: 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
bb60: 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
bb70: 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
bb80: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
bb90: 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
bba0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
bbb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bbc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
bbd0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
bbe0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
bbf0: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
bc00: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
bc10: 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
bc20: 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
bc30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
bc40: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
bc50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bc60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
bc70: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
bc80: 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
bc90: 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
bca0: 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
bcb0: 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
bcc0: 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
bcd0: 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
bce0: 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
bcf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
bd00: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
bd10: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
bd20: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
bd30: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
bd40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
bd50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
bd60: 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
bd70: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
bd80: 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
bd90: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
bda0: 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
bdb0: 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
bdc0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
bdd0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
bde0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
bdf0: 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
be00: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
be10: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
be20: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
be30: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
be40: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
be50: 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
be60: 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
be70: 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
be80: 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a  es per page..**.
be90: 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
bea0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
beb0: 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
bec0: 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
bed0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
bee0: 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
bef0: 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
bf00: 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
bf10: 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
bf20: 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
bf30: 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
bf40: 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
bf50: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
bf60: 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
bf70: 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
bf80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
bf90: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
bfa0: 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
bfb0: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
bfc0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
bfd0: 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
bfe0: 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
bff0: 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
c000: 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
c010: 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
c020: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
c030: 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
c040: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
c050: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
c060: 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
c070: 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
c080: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
c090: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c0a0: 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
c0b0: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
c0c0: 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
c0d0: 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
c0e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
c0f0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
c100: 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
c110: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
c120: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
c130: 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71  eFixed ){.    sq
c140: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c150: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
c160: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
c170: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
c180: 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
c190: 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
c1a0: 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
c1b0: 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  leSize;.  }.  if
c1c0: 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
c1d0: 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
c1e0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
c1f0: 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
c200: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
c210: 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
c220: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
c230: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
c240: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
c250: 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
c260: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
c270: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
c280: 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
c290: 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
c2a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
c2b0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
c2c0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
c2d0: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
c2e0: 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  }.  pBt->usableS
c2f0: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
c300: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
c310: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c320: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
c330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
c340: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
c350: 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
c360: 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
c370: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
c380: 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
c390: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
c3a0: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20  pageSize;.}.int 
c3b0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
c3c0: 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
c3d0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
c3e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
c3f0: 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
c400: 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
c410: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
c420: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c430: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
c440: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
c450: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
c460: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
c470: 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
c480: 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
c490: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
c4a0: 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
c4b0: 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
c4c0: 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
c4d0: 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
c4e0: 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
c4f0: 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
c500: 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
c510: 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
c520: 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
c530: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
c540: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
c550: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
c560: 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
c570: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
c580: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
c590: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
c5a0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c5b0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64  return n;.}.#end
c5c0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
c5d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
c5e0: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
c5f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c600: 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
c610: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
c620: 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
c630: 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
c640: 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
c650: 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
c660: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
c670: 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
c680: 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
c690: 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
c6a0: 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
c6b0: 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
c6c0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
c6d0: 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
c6e0: 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
c6f0: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
c700: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
c710: 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
c720: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
c730: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
c740: 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
c750: 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
c760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
c770: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
c780: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
c790: 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
c7a0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
c7b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c7c0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61 76 20 3d  E_OK;.  int av =
c7d0: 20 28 61 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30   (autoVacuum?1:0
c7e0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  );..  sqlite3Btr
c7f0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
c800: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
c810: 69 78 65 64 20 26 26 20 61 76 21 3d 70 42 74 2d  ixed && av!=pBt-
c820: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
c830: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
c840: 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
c850: 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
c860: 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a  acuum = av;.  }.
c870: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c880: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
c890: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
c8a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c8b0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
c8c0: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
c8d0: 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
c8e0: 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
c8f0: 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
c900: 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
c910: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c920: 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
c930: 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
c940: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c950: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
c960: 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
c970: 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
c980: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
c990: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c9a0: 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
c9b0: 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
c9c0: 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
c9d0: 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
c9e0: 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
c9f0: 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
ca00: 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
ca10: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
ca20: 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
ca30: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
ca40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ca50: 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
ca60: 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
ca70: 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
ca80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
ca90: 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
caa0: 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
cab0: 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
cac0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
cad0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
cae0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
caf0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
cb00: 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
cb10: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
cb20: 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
cb30: 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
cb40: 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
cb50: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
cb60: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
cb70: 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
cb80: 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
cb90: 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
cba0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
cbb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
cbc0: 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
cbd0: 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
cbe0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
cbf0: 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  e1;.  int nPage;
cc00: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
cc10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
cc20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cc30: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  if( pBt->pPage1 
cc40: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
cc50: 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OK;.  rc = sqlit
cc60: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
cc70: 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
cc80: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
cc90: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
cca0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
ccb0: 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
ccc0: 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
ccd0: 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
cce0: 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
ccf0: 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
cd00: 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  le. .  */.  rc =
cd10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
cd20: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
cd30: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
cd40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cd50: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   ){.    goto pag
cd60: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
cd70: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67    }else if( nPag
cd80: 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  e>0 ){.    int p
cd90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  ageSize;.    int
cda0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
cdb0: 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
cdc0: 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
cdd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
cde0: 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  DB;.    if( memc
cdf0: 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
ce00: 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
ce10: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
ce20: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
ce30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
ce40: 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
ce50: 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
ce60: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
ce70: 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
ce80: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
ce90: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
cea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
ceb0: 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64  he maximum embed
cec0: 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
ced0: 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25  t be exactly 25%
cee0: 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d  .  And the minim
cef0: 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64  um.    ** embedd
cf00: 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
cf10: 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f   be 12.5% for bo
cf20: 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64  th leaf-data and
cf30: 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a   non-leaf-data..
cf40: 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
cf50: 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
cf60: 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
cf70: 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
cf80: 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
cf90: 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
cfa0: 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
cfb0: 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
cfc0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
cfd0: 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
cfe0: 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
cff0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
d000: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
d010: 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a     }.    pageSiz
d020: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61  e = get2byte(&pa
d030: 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  ge1[16]);.    if
d040: 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
d050: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20  pageSize)!=0 || 
d060: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a  pageSize<512 ||.
d070: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
d080: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32  MAX_PAGE_SIZE<32
d090: 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e  768 && pageSize>
d0a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
d0b0: 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20  SIZE).    ){.   
d0c0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d0d0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
d0e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
d0f0: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
d100: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
d110: 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
d120: 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
d130: 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e   pageSize!=pBt->
d140: 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
d150: 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
d160: 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
d170: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d180: 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
d190: 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
d1a0: 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
d1b0: 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
d1c0: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
d1d0: 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
d1e0: 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
d1f0: 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
d200: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
d210: 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
d220: 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
d230: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
d240: 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
d250: 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
d260: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
d270: 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
d280: 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
d290: 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
d2a0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d2b0: 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
d2c0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
d2d0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
d2e0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
d2f0: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
d300: 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
d310: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  ce(pBt);.      s
d320: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
d330: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
d340: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
d350: 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
d360: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
d370: 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c   }.    if( usabl
d380: 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20  eSize<500 ){.   
d390: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d3a0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
d3b0: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
d3c0: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
d3d0: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
d3e0: 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
d3f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d400: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d410: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
d420: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
d430: 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
d440: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
d450: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
d460: 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
d470: 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
d480: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
d490: 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
d4a0: 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
d4b0: 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
d4c0: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
d4d0: 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
d4e0: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
d4f0: 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
d500: 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
d510: 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
d520: 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
d530: 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
d540: 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
d550: 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
d560: 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
d570: 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
d580: 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
d590: 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
d5a0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
d5b0: 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
d5c0: 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
d5d0: 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
d5e0: 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
d5f0: 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
d600: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
d610: 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
d620: 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
d630: 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
d640: 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
d650: 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20  oiner, a header 
d660: 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
d670: 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
d680: 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
d690: 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
d6a0: 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
d6b0: 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
d6c0: 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
d6d0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
d6e0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  maxLocal = (pBt-
d6f0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
d700: 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  64/255 - 23;.  p
d710: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
d720: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
d730: 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
d740: 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
d750: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
d760: 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
d770: 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
d780: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
d790: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73  /255 - 23;.  ass
d7a0: 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
d7b0: 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
d7c0: 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
d7d0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
d7e0: 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
d7f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
d800: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
d810: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
d820: 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
d830: 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
d840: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
d850: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
d860: 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
d870: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
d880: 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
d890: 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
d8a0: 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
d8b0: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
d8c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
d8d0: 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
d8e0: 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
d8f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d900: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
d910: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
d920: 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b  dsMutex(pRef) );
d930: 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54  .  if( pRef->inT
d940: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
d950: 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61   ){.    u8 inTra
d960: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d  nsaction = pRef-
d970: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
d980: 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e  ion;.    btreeIn
d990: 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
d9a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
d9b0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
d9c0: 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65  Ref, 0);.    pRe
d9d0: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
d9e0: 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61  ction = inTransa
d9f0: 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d  ction;.    pRef-
da00: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
da10: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72  _NONE;.    if( r
da20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
da30: 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d        pRef->pBt-
da40: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
da50: 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65  .    }.    btree
da60: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
da70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
da80: 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a  ;.}.       ../*.
da90: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
daa0: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
dab0: 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
dac0: 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
dad0: 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
dae0: 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
daf0: 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
db00: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
db10: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
db20: 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
db30: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
db40: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
db50: 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
db60: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
db70: 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
db80: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
db90: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
dba0: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
dbb0: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
dbc0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
dbd0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
dbe0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
dbf0: 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
dc00: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
dc10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
dc20: 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
dc30: 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
dc40: 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
dc50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
dc60: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
dc70: 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
dc80: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
dc90: 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43  _NONE && pBt->pC
dca0: 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d  ursor==0 && pBt-
dcb0: 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
dcc0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
dcd0: 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
dce0: 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20  pPager)>=1 ){.  
dcf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
dd00: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
dd10: 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69 66  ;.#if 0.      if
dd20: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
dd30: 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
dd40: 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
dd50: 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  e = pBt->pPage1;
dd60: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
dd70: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
dd80: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
dd90: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
dda0: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20       pPage->pBt 
ddb0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70  = pBt;.        p
ddc0: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a  Page->pgno = 1;.
ddd0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
dde0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
ddf0: 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
de00: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50     }.    pBt->pP
de10: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
de20: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
de30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
de40: 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  te a new databas
de50: 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
de60: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
de70: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e   of the.** file.
de80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
de90: 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
dea0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
deb0: 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
dec0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
ded0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
dee0: 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  t nPage;..  asse
def0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
df00: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
df10: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
df20: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
df30: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
df40: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
df50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
df60: 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
df70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
df80: 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
df90: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
dfa0: 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
dfb0: 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
dfc0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
dfd0: 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
dfe0: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
dff0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
e000: 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
e010: 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
e020: 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
e030: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
e040: 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
e050: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
e060: 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70  data[16], pBt->p
e070: 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
e080: 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
e090: 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [19] = 1;.  data
e0a0: 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65  [20] = pBt->page
e0b0: 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
e0c0: 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32  leSize;.  data[2
e0d0: 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
e0e0: 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
e0f0: 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
e100: 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
e110: 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
e120: 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
e130: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
e140: 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
e150: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
e160: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
e170: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e180: 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
e190: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
e1a0: 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
e1b0: 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
e1c0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
e1d0: 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
e1e0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
e1f0: 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
e200: 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
e210: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
e220: 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
e230: 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
e240: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
e250: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
e260: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e270: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
e280: 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
e290: 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
e2a0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
e2b0: 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
e2c0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e2d0: 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
e2e0: 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
e2f0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
e300: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
e310: 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
e320: 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
e330: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
e340: 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
e350: 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
e360: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
e370: 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
e380: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
e390: 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
e3a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
e3b0: 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
e3c0: 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
e3d0: 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
e3e0: 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
e3f0: 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
e400: 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
e410: 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
e420: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
e430: 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
e440: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
e450: 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
e460: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
e470: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
e480: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
e490: 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
e4a0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
e4b0: 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
e4c0: 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
e4d0: 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
e4e0: 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
e4f0: 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
e500: 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
e510: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
e520: 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
e530: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e540: 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
e550: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e560: 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
e570: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e580: 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
e590: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
e5a0: 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
e5b0: 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
e5c0: 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
e5d0: 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
e5e0: 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
e5f0: 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
e600: 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
e610: 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
e620: 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
e630: 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
e640: 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
e650: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
e660: 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
e670: 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
e680: 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
e690: 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
e6a0: 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
e6b0: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
e6c0: 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
e6d0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
e6e0: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
e6f0: 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
e700: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
e710: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
e720: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
e730: 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
e740: 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
e750: 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
e760: 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
e770: 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
e780: 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
e790: 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
e7a0: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
e7b0: 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
e7c0: 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
e7d0: 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
e7e0: 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
e7f0: 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
e800: 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
e810: 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
e820: 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
e830: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
e840: 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
e850: 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
e860: 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
e870: 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
e880: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
e890: 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
e8a0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
e8b0: 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
e8c0: 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
e8d0: 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
e8e0: 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
e8f0: 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
e900: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e910: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
e920: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
e930: 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
e940: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
e950: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e960: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
e970: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
e980: 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
e990: 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  db;.  btreeInteg
e9a0: 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
e9b0: 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
e9c0: 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
e9d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
e9e0: 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
e9f0: 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
ea00: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
ea10: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
ea20: 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
ea30: 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
ea40: 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
ea50: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
ea60: 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
ea70: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
ea80: 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
ea90: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
eaa0: 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20  s_begun;.  }..  
eab0: 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
eac0: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
ead0: 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
eae0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
eaf0: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61  /.  if( pBt->rea
eb00: 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20  dOnly && wrflag 
eb10: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
eb20: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
eb30: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
eb40: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  n;.  }..  /* If 
eb50: 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
eb60: 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
eb70: 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
eb80: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
eb90: 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
eba0: 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
ebb0: 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
ebc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
ebd0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
ebe0: 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
ebf0: 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  ITE_BUSY..  */. 
ec00: 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
ec10: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
ec20: 52 49 54 45 20 26 26 20 77 72 66 6c 61 67 20 29  RITE && wrflag )
ec30: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ec40: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
ec50: 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
ec60: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ec70: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
ec80: 43 48 45 0a 20 20 69 66 28 20 77 72 66 6c 61 67  CHE.  if( wrflag
ec90: 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
eca0: 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
ecb0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
ecc0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
ecd0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
ece0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
ecf0: 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
ed00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ed10: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67  _BUSY;.        g
ed20: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
ed30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ed40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20   }.#endif..  do 
ed50: 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  {.    if( pBt->p
ed60: 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
ed70: 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63    do{.        rc
ed80: 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
ed90: 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
eda0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
edb0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
edc0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
edd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ede0: 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
edf0: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61      if( pBt->rea
ee00: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
ee10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
ee20: 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
ee30: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
ee40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
ee50: 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  in(pBt->pPage1->
ee60: 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67 3e  pDbPage, wrflag>
ee70: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
ee80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ee90: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
eea0: 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
eeb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eec0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
eed0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
eee0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
eef0: 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e  wrflag ) pBt->in
ef00: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
ef10: 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  lse{.      unloc
ef20: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
ef30: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
ef40: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
ef50: 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
ef60: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
ef70: 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
ef80: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ef90: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
efa0: 72 28 70 42 74 2c 20 30 29 20 29 3b 0a 0a 20 20  r(pBt, 0) );..  
efb0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
efc0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
efd0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
efe0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
eff0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
f000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
f010: 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
f020: 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
f030: 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
f040: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
f050: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
f060: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
f070: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
f080: 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
f090: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f0a0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
f0b0: 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e  .    if( wrflag>
f0c0: 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  1 ){.      asser
f0d0: 74 28 20 21 70 42 74 2d 3e 70 45 78 63 6c 75 73  t( !pBt->pExclus
f0e0: 69 76 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ive );.      pBt
f0f0: 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20 70  ->pExclusive = p
f100: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f110: 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
f120: 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  :.  btreeIntegri
f130: 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
f140: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
f150: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
f160: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f170: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
f180: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
f190: 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
f1a0: 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
f1b0: 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
f1c0: 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
f1d0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
f1e0: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
f1f0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
f200: 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
f210: 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
f220: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
f230: 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
f240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
f250: 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
f260: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
f270: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
f2a0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
f2b0: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f2d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
f2e0: 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
f2f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
f320: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
f330: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
f340: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69 73  e->pBt;.  int is
f350: 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
f360: 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
f370: 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
f380: 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
f390: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f3a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
f3b0: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
f3c0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
f3d0: 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
f3e0: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  e->pParent);.  i
f3f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f400: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
f410: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
f420: 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
f430: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
f440: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
f450: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
f460: 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
f470: 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
f480: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
f490: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
f4a0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
f4b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f4c0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74  {.      goto set
f4d0: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
f4e0: 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
f4f0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
f500: 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
f510: 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
f520: 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
f530: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
f540: 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
f550: 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
f560: 6e 6f 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  no);.       if( 
f570: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f580: 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
f590: 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
f5a0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
f5b0: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
f5c0: 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
f5d0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
f5e0: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
f5f0: 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
f600: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
f610: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
f620: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
f630: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f  pgno);.  }..set_
f640: 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
f650: 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
f660: 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
f670: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f680: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
f690: 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68   on pPage, which
f6a0: 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
f6b0: 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  o be a btree pag
f6c0: 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c  e, not an overfl
f6d0: 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61  ow.** page, is a
f6e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
f6f0: 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74   iFrom. Modify t
f700: 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  his pointer so t
f710: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
f720: 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74  .** iTo. Paramet
f730: 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
f740: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
f750: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64  ointer to be mod
f760: 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f  ified, as .** fo
f770: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
f780: 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
f790: 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
f7a0: 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
f7b0: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
f7c0: 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
f7d0: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
f7e0: 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
f7f0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
f800: 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
f810: 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
f820: 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
f830: 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f850: 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
f860: 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
f870: 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
f880: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
f890: 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
f8a0: 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
f8b0: 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
f8c0: 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
f8d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
f8e0: 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
f8f0: 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
f900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
f910: 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
f920: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
f930: 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
f940: 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
f950: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f960: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f970: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f980: 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
f990: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
f9a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
f9b0: 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
f9c0: 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
f9d0: 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
f9e0: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
f9f0: 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
fa00: 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
fa10: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
fa20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fa30: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
fa40: 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
fa50: 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
fa60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fa70: 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
fa80: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
fa90: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
faa0: 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73  nt nCell;..    s
fab0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
fac0: 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  age(pPage, 0);. 
fad0: 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
fae0: 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
faf0: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
fb00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
fb10: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
fb20: 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
fb30: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
fb40: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
fb50: 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
fb60: 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
fb70: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
fb80: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
fb90: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
fba0: 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
fbb0: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
fbc0: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
fbd0: 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
fbe0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
fbf0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
fc00: 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
fc10: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
fc20: 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
fc30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fc40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fc50: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
fc60: 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
fc70: 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
fc80: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
fc90: 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
fca0: 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
fcb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
fcc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fcd0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
fce0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
fcf0: 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
fd00: 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
fd10: 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
fd20: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
fd30: 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
fd40: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
fd50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fd60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
fd70: 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
fd80: 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
fd90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
fda0: 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
fdb0: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
fdc0: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
fdd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
fde0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
fdf0: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
fe00: 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
fe10: 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
fe20: 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
fe30: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
fe40: 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
fe50: 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
fe60: 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   valid..*/.stati
fe70: 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
fe80: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
fe90: 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
fea0: 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
feb0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
fec0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
fed0: 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
fee0: 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
fef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
ff00: 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
ff10: 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
ff20: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
ff30: 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
ff40: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
ff50: 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
ff60: 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
ff70: 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
ff80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
ff90: 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
ffa0: 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
ffb0: 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a  int isCommit.){.
ffc0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
ffd0: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
ffe0: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
fff0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
10000 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
10010 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
10020 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
10030 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
10040 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
10050 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
10060 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
10070 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
10080 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
10090 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
100a0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
100b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
100c0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
100d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
100e0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
100f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
10100 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
10110 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
10120 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
10130 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
10140 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
10150 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
10160 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
10170 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
10180 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
10190 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
101a0 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
101b0 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
101c0 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
101d0 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
101e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
101f0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
10200 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
10210 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
10220 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
10230 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10240 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10250 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
10260 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
10270 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
10280 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
10290 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
102a0 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
102b0 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
102c0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
102d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
102e0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
102f0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
10300 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
10310 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
10320 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
10330 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
10340 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
10350 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
10360 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
10370 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
10380 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
10390 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
103a0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
103b0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
103c0 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
103d0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
103e0 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
103f0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
10400 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
10410 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
10420 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
10430 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
10440 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
10450 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
10460 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10490 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
104a0 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
104b0 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
104c0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
104d0 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
104e0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
104f0 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
10500 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
10510 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b  OW2, iFreePage);
10520 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
10530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10540 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10550 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10560 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
10570 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
10580 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
10590 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
105a0 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
105b0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
105c0 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
105d0 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
105e0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
105f0 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
10600 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
10610 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
10620 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
10630 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
10640 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
10650 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
10660 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
106a0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
106b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
106c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
106d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
106e0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
106f0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
10700 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10710 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
10720 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
10730 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
10740 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
10750 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
10760 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
10770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10780 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
10790 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
107a0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
107b0 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
107c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
107d0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
107e0 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
107f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
10800 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67  t rc;.  int nPag
10810 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
10820 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
10830 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
10840 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
10850 51 4c 49 54 45 5f 4f 4b 3f 6e 50 61 67 65 3a 2d  QLITE_OK?nPage:-
10860 31 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  1);.}../* Forwar
10870 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
10880 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
10890 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
108a0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
108b0 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
108c0 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
108d0 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
108e0 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
108f0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
10900 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
10910 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
10920 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
10930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10940 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
10950 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
10960 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a   therefore no.**
10970 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e   point in callin
10980 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
10990 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
109a0 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
109b0 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c  * More specificl
109c0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
109d0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
109e0 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a  organize the .**
109f0 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61   database so tha
10a00 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
10a10 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
10a20 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20  ently in use.** 
10a30 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
10a40 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  use..**.** If th
10a50 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72  e nFin parameter
10a60 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
10a70 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
10a80 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74   assumes.** that
10a90 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
10aa0 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
10ab0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
10ac0 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72  ntil.** it retur
10ad0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
10ae0 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  r an error, and 
10af0 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65  that nFin is the
10b00 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  .** number of pa
10b10 67 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ges the database
10b20 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61   file will conta
10b30 69 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a  in after this .*
10b40 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d  * process is com
10b50 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  plete..*/.static
10b60 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
10b70 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
10b80 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20  t, Pgno nFin){. 
10b90 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20   Pgno iLastPg;  
10ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
10bb0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  st page in the d
10bc0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
10bd0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
10be0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10bf0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
10c00 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
10c10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
10c20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10c30 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
10c40 0a 20 20 69 4c 61 73 74 50 67 20 3d 20 70 42 74  .  iLastPg = pBt
10c50 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 69 66 28 20  ->nTrunc;.  if( 
10c60 69 4c 61 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20  iLastPg==0 ){.  
10c70 20 20 69 4c 61 73 74 50 67 20 3d 20 70 61 67 65    iLastPg = page
10c80 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
10c90 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
10ca0 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
10cb0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
10cc0 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
10cd0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
10ce0 42 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  Bt) ){.    int r
10cf0 63 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  c;.    u8 eType;
10d00 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
10d10 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
10d20 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
10d30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
10d40 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
10d50 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20  nFreeList==0 || 
10d60 6e 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b  nFin==iLastPg ){
10d70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10d80 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10d90 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
10da0 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
10db0 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
10dc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
10dd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10de0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10df0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
10e00 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
10e10 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
10e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10e30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
10e40 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
10e50 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
10e60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46   ){.      if( nF
10e70 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  in==0 ){.       
10e80 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
10e90 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
10ea0 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
10eb0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
10ec0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
10ed0 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72   nFin is non-zer
10ee0 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
10ef0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
10f00 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
10f10 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
10f20 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
10f30 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
10f40 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
10f50 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
10f60 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
10f70 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
10f80 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
10f90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10fa0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
10fb0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
10fc0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
10fd0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
10fe0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
10ff0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
11000 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20  iLastPg, 1);.   
11010 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11030 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11040 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11050 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
11060 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
11070 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11080 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
11090 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
110a0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
110b0 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
110c0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
110d0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
110e0 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
110f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
11100 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  Pg;..      rc = 
11110 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
11120 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
11130 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
11140 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11160 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11170 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
11180 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c  If nFin is zero,
11190 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
111a0 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
111b0 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
111c0 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
111d0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
111e0 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
111f0 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
11200 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
11210 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
11220 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69  her hand, if nFi
11230 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  n is greater tha
11240 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
11250 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
11260 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
11270 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
11280 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
11290 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
112a0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
112b0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
112c0 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
112d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
112e0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
112f0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
11300 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
11310 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c  Pg, &iFreePg, 0,
11320 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
11330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11340 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
11350 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
11360 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
11370 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
11380 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
11390 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
113a0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69       }while( nFi
113b0 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e  n!=0 && iFreePg>
113c0 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
113d0 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
113e0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
113f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11400 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61  e3PagerWrite(pLa
11410 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  stPg->pDbPage);.
11420 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11440 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
11450 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
11460 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
11470 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69  ge, iFreePg, nFi
11480 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n!=0);.      }. 
11490 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
114a0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
114b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
114c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
114d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
114e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42  .    }.  }..  pB
114f0 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73  t->nTrunc = iLas
11500 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65  tPg - 1;.  while
11510 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50  ( pBt->nTrunc==P
11520 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
11530 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
11540 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
11550 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42  Trunc) ){.    pB
11560 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d  t->nTrunc--;.  }
11570 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11580 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
11590 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
115a0 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
115b0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
115c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
115d0 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
115e0 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
115f0 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
11600 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
11610 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
11620 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
11630 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
11640 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
11650 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
11660 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
11670 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
11680 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
11690 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
116a0 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
116b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
116c0 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
116d0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
116e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
116f0 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
11700 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
11710 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
11720 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
11730 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11740 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
11750 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
11760 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
11770 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
11780 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
11790 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
117a0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
117b0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
117c0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
117d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
117e0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
117f0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
11800 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
11810 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b 0a  umStep(pBt, 0);.
11820 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
11830 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11840 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11850 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11860 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
11870 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
11880 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
11890 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
118a0 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
118b0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
118c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
118d0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
118e0 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
118f0 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
11900 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
11910 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11920 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
11930 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
11940 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
11950 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
11960 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
11970 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
11980 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
11990 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
119a0 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
119b0 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
119c0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
119d0 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
119e0 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75  pBt, Pgno *pnTru
119f0 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
11a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
11a10 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
11a20 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e 64 65  ->pPager;.#ifnde
11a30 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  f NDEBUG.  int n
11a40 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
11a50 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
11a60 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  r);.#endif..  as
11a70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11a80 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11a90 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
11aa0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
11ab0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
11ac0 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
11ad0 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
11ae0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
11af0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
11b00 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42 74 2d  0;..    if( pBt-
11b10 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20 20  >nTrunc==0 ){.  
11b20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a      Pgno nFree;.
11b30 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d        Pgno nPtrm
11b40 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ap;.      const 
11b50 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e  int pgsz = pBt->
11b60 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
11b70 69 6e 74 20 6e 4f 72 69 67 20 3d 20 70 61 67 65  int nOrig = page
11b80 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
11b90 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
11ba0 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
11bb0 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b  E(pBt, nOrig) ){
11bc0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11bd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11be0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
11bf0 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45     if( nOrig==PE
11c00 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
11c10 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
11c20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d  nOrig--;.      }
11c30 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67  .      nFree = g
11c40 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
11c50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
11c60 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61 70 20  ;.      nPtrmap 
11c70 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
11c80 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
11c90 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29  , nOrig)+pgsz/5)
11ca0 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20  /(pgsz/5);.     
11cb0 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
11cc0 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
11cd0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
11ce0 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
11cf0 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
11d00 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
11d10 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
11d20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20     nFin--;.     
11d30 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
11d40 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
11d50 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
11d60 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
11d70 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
11d80 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
11d90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77    }.    }..    w
11da0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
11db0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
11dc0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
11dd0 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  (pBt, nFin);.   
11de0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
11df0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
11e00 20 20 20 20 61 73 73 65 72 74 28 6e 46 69 6e 3d      assert(nFin=
11e10 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e  =0 || pBt->nTrun
11e20 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42  c==0 || nFin<=pB
11e30 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  t->nTrunc);.    
11e40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11e50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
11e60 3e 6e 54 72 75 6e 63 20 26 26 20 6e 46 69 6e 20  >nTrunc && nFin 
11e70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11e80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
11e90 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
11ea0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
11eb0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
11ec0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
11ed0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
11ee0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
11ef0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
11f00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
11f10 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b  ->nTrunc = nFin;
11f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11f30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11f50 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
11f60 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
11f70 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
11f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11f90 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74    *pnTrunc = pBt
11fa0 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42  ->nTrunc;.    pB
11fb0 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20  t->nTrunc = 0;. 
11fc0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
11fd0 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
11fe0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
11ff0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12000 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  }..#endif../*.**
12010 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
12020 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
12030 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
12040 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
12050 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
12060 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
12070 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
12080 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
12090 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
120a0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
120b0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
120c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
120d0 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
120e0 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
120f0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
12100 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
12110 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
12120 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
12130 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
12140 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
12150 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
12160 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
12170 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
12180 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
12190 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
121a0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
121b0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
121c0 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
121d0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
121e0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
121f0 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
12200 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
12210 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
12220 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
12230 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
12240 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
12250 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
12260 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
12270 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
12280 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
12290 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
122a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
122b0 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  it() for the sec
122c0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
122d0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
122e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
122f0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
12300 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
12310 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
12320 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
12330 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
12340 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
12350 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
12360 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
12370 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
12380 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
12390 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
123a0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
123b0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
123c0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
123d0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
123e0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
123f0 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
12400 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
12410 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
12420 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
12430 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
12440 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
12450 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12460 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
12470 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
12480 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
12490 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
124a0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
124b0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
124c0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
124d0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
124e0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
124f0 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
12500 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
12510 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
12520 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
12530 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
12540 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
12550 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12560 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12570 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
12580 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
12590 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
125a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
125b0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
125c0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
125d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
125e0 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20  ->pBt;.    Pgno 
125f0 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20  nTrunc = 0;.    
12600 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12610 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64  r(p);.    pBt->d
12620 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66 6e 64  b = p->db;.#ifnd
12630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12640 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
12650 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
12660 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
12670 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
12680 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20  (pBt, &nTrunc); 
12690 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
126a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
126b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
126c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
126d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
126e0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
126f0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
12700 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
12710 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
12720 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  r, zMaster, nTru
12730 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  nc, 0);.    sqli
12740 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12750 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12760 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
12770 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
12780 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
12790 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
127a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
127b0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
127c0 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
127d0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
127e0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
127f0 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65  eeSync() routine
12800 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
12810 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
12820 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70   be invoked.** p
12830 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
12840 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
12850 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
12860 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 69  ync() routine di
12870 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77 6f 72  d.** all the wor
12880 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
12890 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
128a0 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
128b0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
128c0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
128d0 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
128e0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
128f0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
12900 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
12910 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
12920 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c 6c 62  uncate the rollb
12930 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28  ack journal.** (
12940 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65  which causes the
12950 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
12960 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72 6f 70  commit) and drop
12970 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   locks..**.** Th
12980 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
12990 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
129a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
129b0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
129c0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
129d0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
129e0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
129f0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
12a00 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12a10 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
12a20 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
12a30 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12a40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12a50 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
12a60 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74  db = p->db;.  bt
12a70 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
12a80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
12a90 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
12aa0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
12ab0 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
12ac0 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
12ad0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
12ae0 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
12af0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
12b00 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
12b10 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
12b20 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
12b30 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
12b40 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
12b50 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
12b60 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
12b70 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
12b80 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
12b90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
12ba0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
12bb0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
12bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12bd0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
12be0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12bf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
12c10 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
12c20 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
12c30 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
12c40 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c  ;.  }.  unlockAl
12c50 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f  lTables(p);..  /
12c60 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
12c70 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  has any kind of 
12c80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
12c90 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
12ca0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
12cb0 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
12cc0 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
12cd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
12ce0 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20  ount reaches 0, 
12cf0 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61  set.  ** the sha
12d00 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
12d10 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
12d20 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
12d30 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20  () call below.  
12d40 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ** will unlock t
12d50 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20  he pager..  */. 
12d60 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
12d70 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
12d80 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
12d90 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tion--;.    if( 
12da0 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
12db0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
12dc0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
12dd0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
12de0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
12df0 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20 63  et the handles c
12e00 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
12e10 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
12e20 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
12e30 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  k.  ** the pager
12e40 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
12e50 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
12e60 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
12e70 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
12e80 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
12e90 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63  NS_NONE;.  unloc
12ea0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
12eb0 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  Bt);..  btreeInt
12ec0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
12ed0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12ee0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12ef0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12f00 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
12f10 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
12f20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
12f30 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
12f40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
12f50 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12f60 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12f70 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
12f80 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
12f90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12fa0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
12fb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12fc0 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20  aseTwo(p);.  }. 
12fd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12fe0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12ff0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
13000 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
13010 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
13020 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f   write-cursors o
13030 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64  pen on this hand
13040 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  le. This is for 
13050 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
13060 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
13070 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
13080 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
13090 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
130a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
130b0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
130c0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72  is routine, a wr
130d0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e  ite-cursor is an
130e0 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
130f0 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77   is capable of w
13100 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
13110 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61  tabse.  That mea
13120 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  ns the cursor wa
13130 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20  s.** originally 
13140 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
13150 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ng and the curso
13160 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73  r has not be dis
13170 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69  abled.** by havi
13180 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61  ng its state cha
13190 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46  nged to CURSOR_F
131a0 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  AULT..*/.static 
131b0 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75  int countWriteCu
131c0 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
131d0 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
131e0 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
131f0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
13200 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
13210 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
13220 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
13230 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70  Cur->wrFlag && p
13240 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
13250 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
13260 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
13270 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
13280 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
13290 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
132a0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
132b0 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
132c0 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
132d0 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
132e0 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74  on BtShared that
132f0 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
13300 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  ences..**.** Eve
13310 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69  ry cursor is tri
13320 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
13330 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c  cursors that bel
13340 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20  ong.** to other 
13350 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13360 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
13370 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a   to be sharing.*
13380 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  * the cache with
13390 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
133a0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
133b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
133c0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a  ollback occurs..
133d0 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75  ** All cursors u
133e0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61  sing the same ca
133f0 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70  che must be trip
13400 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e  ped.** to preven
13410 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69  t them from tryi
13420 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74  ng to use the bt
13430 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ree after.** the
13440 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
13450 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
13460 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73  e deleted tables
13470 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f  .** or moved roo
13480 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69  t pages, so it i
13490 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
134a0 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20   to.** save the 
134b0 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
134c0 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72  sor.  The cursor
134d0 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
134e0 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  lidated..*/.void
134f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
13500 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
13510 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
13520 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72  rrCode){.  BtCur
13530 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  sor *p;.  sqlite
13540 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
13550 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ee);.  for(p=pBt
13560 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
13570 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
13580 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73  ){.    clearCurs
13590 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
135a0 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
135b0 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
135c0 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f   p->skip = errCo
135d0 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  de;.  }.  sqlite
135e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
135f0 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
13600 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
13610 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
13620 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
13630 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
13640 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
13650 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
13660 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
13670 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
13680 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
13690 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
136a0 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
136b0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
136c0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
136d0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
136e0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
136f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13700 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
13710 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
13720 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
13730 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
13740 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
13750 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
13760 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
13770 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
13780 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13790 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
137a0 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
137b0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
137c0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
137d0 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
137e0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
137f0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
13800 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13810 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51  CHE.  if( rc!=SQ
13820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
13830 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72  * This is a horr
13840 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20  ible situation. 
13850 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  An IO or malloc(
13860 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  ) error occured 
13870 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72  whilst.    ** tr
13880 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72  ying to save cur
13890 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49  sor positions. I
138a0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
138b0 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20  omatic rollback 
138c0 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  (as.    ** the r
138d0 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74  esult of a const
138e0 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20  raint, malloc() 
138f0 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72  failure or IO er
13900 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a  ror) then .    *
13910 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20  * the cache may 
13920 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  be internally in
13930 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20  consistent (not 
13940 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72  contain valid tr
13950 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77  ees) so.    ** w
13960 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20  e cannot simply 
13970 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
13980 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
13990 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a  Instead, abort .
139a0 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69      ** all queri
139b0 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  es that may be u
139c0 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20  sing any of the 
139d0 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69  cursors that fai
139e0 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20  led to save..   
139f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
13a00 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
13a10 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23  rs(p, rc);.  }.#
13a20 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
13a30 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c  egrity(p);.  unl
13a40 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
13a50 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
13a60 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
13a70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
13a80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13a90 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13aa0 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
13ab0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
13ac0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
13ad0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
13ae0 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
13af0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
13b00 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
13b10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
13b20 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
13b30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
13b40 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
13b50 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
13b60 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
13b70 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
13b80 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
13b90 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65    ** call sqlite
13ba0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
13bb0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
13bc0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
13bd0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
13be0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
13bf0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ly. */.    if( s
13c00 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
13c10 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
13c20 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
13c30 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
13c40 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13c50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
13c60 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
13c70 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
13c80 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
13c90 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
13ca0 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  AD;.  }..  if( p
13cb0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
13cc0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
13cd0 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
13ce0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
13cf0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
13d00 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
13d10 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
13d20 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
13d30 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
13d40 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
13d50 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72  }.  }..  p->inTr
13d60 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
13d70 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
13d80 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  = 0;.  unlockBtr
13d90 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
13da0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
13db0 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
13dc0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13de0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
13df0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
13e00 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74  ction.  The subt
13e10 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a  ransaction can.*
13e20 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
13e30 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
13e40 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
13e50 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59  ransaction..** Y
13e60 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
13e70 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
13e80 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
13e90 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a  btransaction..**
13ea0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
13eb0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
13ec0 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68  omatically if th
13ed0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
13ee0 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72  on.** commits or
13ef0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
13f00 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74  ** Only one subt
13f10 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
13f20 65 20 61 63 74 69 76 65 20 61 74 20 61 20 74 69  e active at a ti
13f30 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  me.  It is an er
13f40 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f  ror to try.** to
13f50 20 73 74 61 72 74 20 61 20 6e 65 77 20 73 75 62   start a new sub
13f60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61  transaction if a
13f70 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73 61  nother subtransa
13f80 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
13f90 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53   active..**.** S
13fa0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
13fb0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
13fc0 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
13fd0 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
13fe0 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
13ff0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
14000 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
14010 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
14020 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
14030 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
14040 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
14050 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
14060 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
14070 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
14080 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
14090 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
140a0 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
140b0 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
140c0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
140d0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
140e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
140f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14100 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
14110 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
14120 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
14130 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e    if( (p->inTran
14140 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  s!=TRANS_WRITE) 
14150 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29  || pBt->inStmt )
14160 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
14170 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
14180 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
14190 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
141a0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
141b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
141c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
141d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  );.    rc = pBt-
141e0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
141f0 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50  TE_OK : sqlite3P
14200 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42  agerStmtBegin(pB
14210 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
14220 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pBt->inStmt = 1;
14230 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
14240 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
14260 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73  .** Commit the s
14270 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  tatment subtrans
14280 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
14290 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49   in progress.  I
142a0 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73  f no.** subtrans
142b0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
142c0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
142d0 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
142e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
142f0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
14300 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
14310 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14320 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14330 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
14340 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
14350 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
14360 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
14370 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14380 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
14390 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
143a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
143b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
143c0 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
143d0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
143e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
143f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14400 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61  * Rollback the a
14410 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20  ctive statement 
14420 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
14430 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61   If no subtransa
14440 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69  ction.** is acti
14450 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ve this routine 
14460 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
14470 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69  * All cursors wi
14480 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
14490 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
144a0 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
144b0 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75  t.** to use a cu
144c0 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  rsor that was op
144d0 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
144e0 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
144f0 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65  ation.** will re
14500 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
14510 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14520 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
14530 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
14540 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14550 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
14560 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
14570 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14580 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
14590 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42   p->db;.  if( pB
145a0 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
145b0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
145c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
145d0 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
145e0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
145f0 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
14600 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
14610 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14630 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
14640 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
14650 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
14660 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
14670 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68  e.** iTable.  Th
14680 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69  e act of acquiri
14690 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73  ng a cursor gets
146a0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
146b0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
146c0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
146d0 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
146e0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
146f0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
14700 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
14710 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
14720 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
14730 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
14740 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
14750 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
14760 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
14770 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
14780 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
14790 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
147a0 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
147b0 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
147c0 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
147d0 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
147e0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
147f0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
14800 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
14810 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
14820 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14830 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
14840 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
14850 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
14860 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
14870 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
14880 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
14890 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
148a0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
148b0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
148c0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
148d0 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
148e0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
148f0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
14900 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
14910 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
14920 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
14930 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
14940 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14950 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
14960 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
14970 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
14980 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
14990 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
149a0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
149b0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
149c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
149d0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
149e0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
149f0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
14a00 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
14a10 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
14a20 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
14a30 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
14a40 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
14a50 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
14a60 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
14a70 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
14a80 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ab0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
14ac0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
14af0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
14b00 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
14b10 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
14b40 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
14b50 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
14b60 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
14b70 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
14b80 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
14b90 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
14ba0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
14bd0 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
14be0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
14bf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14c00 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
14c10 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
14c20 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
14c30 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ;.  if( wrFlag )
14c40 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72  {.    if( pBt->r
14c50 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
14c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
14c70 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
14c80 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64     if( checkRead
14c90 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c  Locks(p, iTable,
14ca0 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
14cb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
14cc0 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  CKED;.    }.  }.
14cd0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
14ce0 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  e1==0 ){.    rc 
14cf0 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  = lockBtreeWithR
14d00 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28  etry(p);.    if(
14d10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14d20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
14d30 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
14d40 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
14d50 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  & wrFlag ){.    
14d60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14d70 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
14d80 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
14d90 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
14da0 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  ble;.  if( iTabl
14db0 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61 67  e==1 && pagerPag
14dc0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
14dd0 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  er)==0 ){.    rc
14de0 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b   = SQLITE_EMPTY;
14df0 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
14e00 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
14e10 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  n;.  }.  rc = ge
14e20 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
14e30 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
14e40 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  , &pCur->pPage, 
14e50 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
14e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
14e70 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
14e80 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
14e90 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
14ea0 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
14eb0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
14ec0 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
14ed0 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
14ee0 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74  ariables, link t
14ef0 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
14f00 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
14f10 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20   and set *ppCur 
14f20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74  (the.  ** output
14f30 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
14f40 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a  s function)..  *
14f50 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  /.  pCur->pKeyIn
14f60 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
14f70 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
14f80 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
14f90 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72   pBt;.  pCur->wr
14fa0 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20  Flag = wrFlag;. 
14fb0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
14fc0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
14fd0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
14fe0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
14ff0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
15000 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
15010 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
15020 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
15030 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a 20 20  SOR_INVALID;..  
15040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15050 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72  ;..create_cursor
15060 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65  _exception:.  re
15070 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
15080 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b  pPage);.  unlock
15090 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
150a0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
150b0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
150c0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
150d0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15100 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
15110 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
15140 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
15150 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
15160 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
15190 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
151a0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
151b0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
151e0 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
151f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15220 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
15230 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
15240 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
15250 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15260 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d   p->pBt->db = p-
15270 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  >db;.  rc = btre
15280 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
15290 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
152a0 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71  nfo, pCur);.  sq
152b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
152c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
152d0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
152e0 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 7b  reeCursorSize(){
152f0 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66  .  return sizeof
15300 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a  (BtCursor);.}...
15310 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
15320 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
15330 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15340 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
15350 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
15360 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
15370 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
15380 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
15390 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
153a0 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
153b0 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
153c0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
153d0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42 74  pBtree ){.    Bt
153e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
153f0 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
15400 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15410 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42 74 2d  Btree);.    pBt-
15420 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  >db = pBtree->db
15430 3b 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f  ;.    clearCurso
15440 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
15450 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
15460 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
15470 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
15480 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
15490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
154a0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
154b0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
154c0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
154d0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
154e0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
154f0 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
15500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
15510 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50  asePage(pCur->pP
15520 61 67 65 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  age);.    unlock
15530 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
15540 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t);.    invalida
15550 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
15560 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71  pCur);.    /* sq
15570 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
15580 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
15590 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
155a0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
155b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
155c0 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70  *.** Make a temp
155d0 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20  orary cursor by 
155e0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66  filling in the f
155f0 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75  ields of pTempCu
15600 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72  r..** The tempor
15610 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  ary cursor is no
15620 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  t on the cursor 
15630 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72  list for the Btr
15640 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
15650 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
15660 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
15670 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a  pCur, BtCursor *
15680 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 61 73 73  pTempCur){.  ass
15690 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
156a0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
156b0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72   memcpy(pTempCur
156c0 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a  , pCur, sizeof(*
156d0 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  pCur));.  pTempC
156e0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
156f0 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
15700 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d   = 0;.  if( pTem
15710 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
15720 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
15730 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  ef(pTempCur->pPa
15740 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
15750 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
15760 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
15770 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
15780 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
15790 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
157a0 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
157b0 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20   above..*/.void 
157c0 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
157d0 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74  aseTempCursor(Bt
157e0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
157f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
15800 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
15810 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  );.  if( pCur->p
15820 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Page ){.    sqli
15830 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43  te3PagerUnref(pC
15840 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61  ur->pPage->pDbPa
15850 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
15860 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
15870 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
15880 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
15890 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
158a0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
158b0 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
158c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
158d0 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c  lid, call.** sql
158e0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
158f0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
15900 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
15910 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
15920 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
15930 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
15940 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
15950 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
15960 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
15970 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71  r of calls to sq
15980 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
15990 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
159a0 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
159b0 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
159c0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
159d0 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
159e0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
159f0 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
15a00 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
15a10 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
15a20 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
15a30 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
15a40 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
15a50 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
15a60 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
15a70 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
15a80 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
15a90 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
15aa0 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
15ab0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
15ac0 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
15ad0 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
15ae0 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
15af0 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
15b00 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
15b10 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
15b20 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
15b30 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
15b40 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
15b50 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
15b60 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
15b70 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
15b80 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65  nfo info;.    me
15b90 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
15ba0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
15bb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
15bc0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
15bd0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
15be0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
15bf0 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
15c00 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
15c10 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
15c20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
15c30 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
15c40 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
15c50 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
15c60 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
15c70 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
15c80 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
15c90 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
15ca0 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
15cb0 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
15cc0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
15cd0 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
15ce0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
15cf0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15d00 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
15d10 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
15d20 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69  r->idx, &pCur->i
15d30 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
15d40 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
15d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15d60 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
15d70 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
15d80 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
15d90 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
15da0 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
15db0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
15dc0 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
15dd0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
15de0 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
15df0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
15e00 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e30 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
15e40 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
15e80 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
15e90 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
15ea0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
15eb0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20  pCur->info);    
15ec0 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d       \.    pCur-
15ed0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20  >validNKey = 1; 
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15f10 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f50 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
15f60 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
15f70 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fa0 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
15fb0 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
15fc0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
15fd0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
15fe0 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
15ff0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
16000 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
16010 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
16020 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
16030 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
16040 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
16050 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
16060 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
16070 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
16080 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
16090 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
160a0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
160b0 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
160c0 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
160d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
160e0 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74   the key..*/.int
160f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
16100 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
16110 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
16120 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
16130 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
16140 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
16150 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
16160 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
16170 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
16180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16190 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
161a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
161b0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
161c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
161d0 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
161e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
161f0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
16200 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
16210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16220 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
16230 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
16240 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
16250 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
16260 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16270 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
16280 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
16290 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
162a0 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
162b0 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
162c0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
162d0 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
162e0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
162f0 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
16300 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
16310 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
16320 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
16330 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
16340 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
16350 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
16360 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
16370 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
16380 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
16390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
163a0 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
163b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
163c0 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
163d0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
163e0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
163f0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
16400 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
16410 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
16420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16430 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
16440 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16450 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
16460 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16470 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
16480 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
16490 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
164a0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LID ){.      /* 
164b0 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
164c0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
164d0 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
164e0 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   */.      *pSize
164f0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
16500 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
16510 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
16520 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
16530 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
16540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
16550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
16560 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16570 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
16580 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
16590 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
165a0 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
165b0 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
165c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
165d0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
165e0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
165f0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
16600 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
16610 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
16620 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
16630 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
16640 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
16650 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
16660 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
16670 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
16680 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16690 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
166a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
166b0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
166c0 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e  *.** Unless pPgn
166d0 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74  oNext is NULL, t
166e0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
166f0 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
16700 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20  low .** page in 
16710 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
16720 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
16730 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
16740 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65  e ovfl.** is the
16750 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
16760 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a  s linked list, *
16770 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
16780 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
16790 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
167a0 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20  t NULL, *ppPage 
167b0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d 65  is set to the Me
167c0 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a  mPage* handle.**
167d0 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e 20   for page ovfl. 
167e0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 70  The underlying p
167f0 61 67 65 72 20 70 61 67 65 20 6d 61 79 20 68 61  ager page may ha
16800 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
16810 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 6f  d.** with the no
16820 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65 74  Content flag set
16830 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20 64 61  , so the page da
16840 74 61 20 61 63 63 65 73 73 61 62 6c 65 20 76 69  ta accessable vi
16850 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65  a.** this handle
16860 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
16870 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
16880 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
16890 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
168a0 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66  pBt, .  Pgno ovf
168b0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
168c0 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77       /* Overflow
168d0 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   page */.  MemPa
168e0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
168f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
16900 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 2a  MemPage handle *
16910 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
16920 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
16930 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
16940 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
16950 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
16960 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  next = 0;.  int 
16970 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
16980 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16990 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
169a0 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  .  /* One of the
169b0 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e  se must not be N
169c0 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ULL. Otherwise, 
169d0 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75  why call this fu
169e0 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73  nction? */.  ass
169f0 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70 50  ert(ppPage || pP
16a00 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20  gnoNext);..  /* 
16a10 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  If pPgnoNext is 
16a20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
16a30 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
16a40 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  g called to obta
16a50 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67  in.  ** a MemPag
16a60 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  e* reference onl
16a70 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61 20  y. No page-data 
16a80 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
16a90 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  his case..  */. 
16aa0 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74 20   if( !pPgnoNext 
16ab0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
16ac0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
16ad0 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70 50  e(pBt, ovfl, ppP
16ae0 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69  age, 1);.  }..#i
16af0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16b00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
16b10 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
16b20 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
16b30 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
16b40 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
16b50 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
16b60 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
16b70 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
16b80 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
16b90 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
16ba0 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
16bb0 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
16bc0 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
16bd0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
16be0 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
16bf0 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
16c00 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
16c10 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
16c20 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
16c30 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
16c40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
16c50 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
16c60 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
16c70 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
16c80 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
16c90 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
16ca0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
16cb0 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
16cc0 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
16cd0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
16ce0 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
16cf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
16d00 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61   iGuess<=pagerPa
16d10 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
16d20 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
16d30 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
16d40 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
16d50 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
16d60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16d70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
16d80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
16d90 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
16da0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
16db0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
16dc0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
16dd0 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
16de0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
16df0 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d  if..  if( next==
16e00 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a 20  0 || ppPage ){. 
16e10 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
16e20 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d  e = 0;..    rc =
16e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16e40 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
16e50 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29  &pPage, next!=0)
16e60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d  ;.    assert(rc=
16e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
16e80 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28  age==0);.    if(
16e90 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d   next==0 && rc==
16ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16eb0 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
16ec0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
16ed0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
16ee0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20   ppPage ){.     
16ef0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
16f00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16f10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
16f20 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
16f30 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
16f40 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20  next;..  return 
16f50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  rc;.}../*.** Cop
16f60 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
16f70 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
16f80 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
16f90 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
16fa0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
16fb0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
16fc0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
16fd0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
16fe0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
16ff0 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
17000 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
17010 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
17020 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
17030 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
17040 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
17050 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
17060 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
17070 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
17080 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
17090 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
170a0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
170b0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
170c0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
170d0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
170e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
170f0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
17100 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
17110 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
17120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
17130 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
17140 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
17150 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17160 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
17170 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17190 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
171a0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
171b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
171c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
171d0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
171e0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
171f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
17200 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
17210 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
17220 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
17230 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
17240 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
17250 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
17260 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
17270 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
17280 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
17290 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
172a0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
172b0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
172c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
172d0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
172e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
172f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17300 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
17310 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
17320 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
17330 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
17340 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
17350 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
17360 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
17370 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
17380 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
17390 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
173a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
173b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
173c0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
173d0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
173e0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
173f0 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
17400 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
17410 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
17420 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
17430 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
17440 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
17450 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
17460 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
17470 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
17480 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
17490 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
174a0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
174b0 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
174c0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
174d0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
174e0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
174f0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
17500 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
17510 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
17520 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
17530 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  uf..**.** This r
17540 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
17550 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69  make a distincti
17560 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61  on between key a
17570 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a  nd data..** It j
17580 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69  ust reads or wri
17590 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  tes bytes from t
175a0 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
175b0 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a    Data might .**
175c0 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
175d0 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73  ain page or be s
175e0 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
175f0 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
17600 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a  w .** pages..**.
17610 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
17620 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
17630 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
17640 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
17650 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
17660 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
17670 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
17680 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
17690 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
176a0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
176b0 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
176c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
176d0 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
176e0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
176f0 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
17700 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
17710 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
17720 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
17730 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
17740 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
17750 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
17760 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
17770 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
17780 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
17790 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
177a0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
177b0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
177c0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
177d0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
177e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
177f0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
17800 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
17810 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
17820 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
17830 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
17840 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
17850 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
17860 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
17870 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
17880 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
17890 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
178a0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
178b0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
178c0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
178d0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
178e0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
178f0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
17900 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
17910 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
17920 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
17930 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
17940 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
17950 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
17960 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
17970 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
17980 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
17990 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74  payload */.  int
179a0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
179b0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
179c0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
179d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
179e0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
179f0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
17a00 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
17a10 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20  t skipKey,      
17a20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
17a30 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
17a40 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  his is true */. 
17a50 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
17a60 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
17a70 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
17a80 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
17a90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
17aa0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
17ab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17ac0 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
17ad0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
17ae0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
17af0 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20  pCur->pPage;    
17b00 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
17b10 66 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  f current cursor
17b20 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
17b30 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b50 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
17b60 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
17b70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
17b90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
17ba0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
17bb0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
17bc0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
17bd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
17be0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
17bf0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
17c00 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
17c10 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65  x(pCur) );..  ge
17c20 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
17c30 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
17c40 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b  ur->info.pCell +
17c50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
17c60 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70  der;.  nKey = (p
17c70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30  Page->intKey ? 0
17c80 20 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   : pCur->info.nK
17c90 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70  ey);..  if( skip
17ca0 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  Key ){.    offse
17cb0 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20  t += nKey;.  }. 
17cc0 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
17cd0 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
17ce0 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 2f  o.nData ){.    /
17cf0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
17d00 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
17d10 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
17d20 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
17d30 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
17d40 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
17d50 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
17d60 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
17d70 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
17d80 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
17d90 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
17da0 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
17db0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
17dc0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
17dd0 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
17de0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
17df0 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
17e00 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
17e10 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
17e20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
17e30 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
17e40 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
17e50 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
17e60 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
17e70 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
17e80 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
17e90 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
17ea0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
17eb0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
17ec0 0a 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e  ..  pBt = pCur->
17ed0 70 42 74 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pBt;.  if( rc==S
17ee0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
17ef0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  0 ){.    const i
17f00 6e 74 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  nt ovflSize = pB
17f10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
17f20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
17f30 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
17f40 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
17f50 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
17f60 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
17f70 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
17f80 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
17f90 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17fa0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
17fb0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
17fc0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
17fd0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
17fe0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
17ff0 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
18000 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
18010 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
18020 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
18030 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
18040 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
18050 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
18060 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
18070 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
18080 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
18090 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
180a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
180b0 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
180c0 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
180d0 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
180e0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
180f0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
18100 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
18110 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
18120 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
18130 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
18140 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
18150 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
18160 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
18170 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
18180 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
18190 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
181a0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
181b0 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
181c0 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
181d0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
181e0 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
181f0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
18200 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
18210 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21    if( nOvfl && !
18220 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
18230 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18240 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18260 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
18270 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
18280 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
18290 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
182a0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
182b0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
182c0 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
182d0 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
182e0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
182f0 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
18300 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
18310 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
18320 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
18330 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
18340 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
18350 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
18360 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
18370 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18380 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
18390 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
183a0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
183b0 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
183c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
183d0 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
183e0 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
183f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18400 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
18410 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
18420 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
18430 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
18440 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
18450 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
18460 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
18470 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
18480 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
18490 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
184a0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
184b0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
184c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
184d0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
184e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
184f0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
18500 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
18510 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
18520 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
18530 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
18540 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
18550 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
18560 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
18570 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
18580 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
18590 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
185a0 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
185b0 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
185c0 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
185d0 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
185e0 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
185f0 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
18600 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
18610 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
18620 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
18630 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
18640 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18650 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
18660 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
18670 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
18680 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
18690 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
186a0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
186b0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
186c0 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
186d0 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
186e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
186f0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
18700 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
18710 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
18720 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
18730 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
18740 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
18750 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
18760 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
18770 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
18780 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
18790 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
187a0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
187b0 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
187c0 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
187d0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
187e0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
187f0 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  bPage;.        i
18800 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
18810 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18820 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
18830 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
18840 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
18850 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18870 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
18880 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
18890 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
188a0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
188b0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
188c0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
188d0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
188e0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
188f0 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
18900 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
18910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18920 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
18930 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
18940 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
18950 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
18960 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18970 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
18980 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18990 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
189a0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
189b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66  ;.          pBuf
189c0 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d   += a;.        }
189d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
189e0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
189f0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
18a00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18a10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18a20 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
18a30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18a40 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
18a50 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
18a60 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
18a70 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
18a80 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
18a90 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
18aa0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
18ab0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
18ac0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
18ad0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
18ae0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
18af0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
18b00 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
18b10 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
18b20 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
18b30 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
18b40 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
18b50 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
18b60 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
18b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
18b80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
18b90 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
18ba0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
18bb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
18bc0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
18bd0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
18be0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
18bf0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18c00 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
18c10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18c20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18c30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18c40 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18c50 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18c60 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  0 );.    if( pCu
18c70 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
18c80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18c90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18ca0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
18cb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
18cc0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  age->intKey==0 )
18cd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
18ce0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
18cf0 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
18d00 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
18d10 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
18d20 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
18d30 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
18d40 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c  d char*)pBuf, 0,
18d50 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
18d60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
18d70 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
18d80 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
18d90 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
18da0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
18db0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
18dc0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
18dd0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
18de0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
18df0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
18e00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
18e10 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18e20 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
18e30 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
18e40 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
18e50 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
18e60 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
18e70 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
18e80 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
18e90 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
18ea0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
18eb0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
18ec0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
18ed0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
18ee0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
18ef0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18f00 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
18f10 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
18f20 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
18f30 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
18f40 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
18f50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
18f60 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
18f70 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
18f80 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
18f90 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
18fa0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18fb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
18fc0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
18fd0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
18fe0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18ff0 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
19000 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
19010 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
19020 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61  r->idx<pCur->pPa
19030 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
19040 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
19050 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
19060 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20  , amt, pBuf, 1, 
19070 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
19080 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19090 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
190a0 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
190b0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
190c0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
190d0 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
190e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
190f0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
19100 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
19110 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
19120 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
19130 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
19140 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
19150 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
19160 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
19170 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
19180 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
19190 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
191a0 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
191b0 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
191c0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
191d0 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
191e0 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
191f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19200 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
19210 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
19220 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
19230 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
19240 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
19250 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
19260 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
19270 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
19280 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
19290 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
192a0 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
192b0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
192c0 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
192d0 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
192e0 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
192f0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
19300 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
19310 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
19320 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
19330 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
19340 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20  o reassembly.** 
19350 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
19360 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
19370 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
19380 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
19390 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
193a0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
193b0 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
193c0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
193d0 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
193e0 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
193f0 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
19400 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
19410 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
19420 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
19430 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
19440 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19450 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
19460 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
19470 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
19480 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
19490 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
194a0 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
194b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
194c0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
194d0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
194e0 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
194f0 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
19500 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
19510 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
19520 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
19530 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
19540 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
19550 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
19560 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   u32 nKey;.  int
19570 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
19580 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
19590 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
195a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
195b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
195c0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
195d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
195e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
195f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
19600 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ge;.  assert( pC
19610 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
19620 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
19630 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c  Cell );.  getCel
19640 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
19650 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
19660 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
19670 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
19680 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
19690 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
196a0 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
196b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
196c0 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  nKey = pCur->inf
196d0 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
196e0 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
196f0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
19700 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
19710 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19720 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
19730 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
19740 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19750 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61  l;.    if( nLoca
19760 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  l>nKey ){.      
19770 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20  nLocal = nKey;. 
19780 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74     }.  }.  *pAmt
19790 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74   = nLocal;.  ret
197a0 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a  urn aPayload;.}.
197b0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
197c0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
197d0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
197e0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
197f0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
19800 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
19810 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
19820 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
19830 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
19840 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
19850 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
19860 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
19870 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
19880 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
19890 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
198a0 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
198b0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
198c0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
198d0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
198e0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
198f0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
19900 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
19910 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
19920 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
19930 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
19940 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
19950 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
19960 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
19970 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
19980 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
19990 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
199a0 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
199b0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
199c0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
199d0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
199e0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
199f0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
19a00 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
19a10 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
19a20 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
19a30 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
19a40 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19a50 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
19a60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19a70 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
19a80 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
19a90 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
19aa0 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
19ab0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19ac0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
19ad0 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
19ae0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
19af0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
19b00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19b10 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
19b20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
19b30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19b40 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
19b50 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
19b60 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
19b70 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
19b80 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
19b90 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
19ba0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
19bb0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
19bc0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
19bd0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
19be0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
19bf0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
19c00 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61   move to..*/.sta
19c10 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
19c20 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
19c30 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
19c40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
19c50 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
19c60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64  .  MemPage *pOld
19c70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
19c80 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
19c90 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
19ca0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19cb0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
19cc0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19cd0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19ce0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
19cf0 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
19d00 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70  no, &pNewPage, p
19d10 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69  Cur->pPage);.  i
19d20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19d30 63 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69  c;.  pNewPage->i
19d40 64 78 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d  dxParent = pCur-
19d50 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65  >idx;.  pOldPage
19d60 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
19d70 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53    pOldPage->idxS
19d80 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65  hift = 0;.  rele
19d90 61 73 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65  asePage(pOldPage
19da0 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65  );.  pCur->pPage
19db0 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
19dc0 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20  Cur->idx = 0;.  
19dd0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
19de0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
19df0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
19e00 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
19e10 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75  ll<1 ){.    retu
19e20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19e30 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
19e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19e50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19e60 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
19e70 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c 20   is the virtual 
19e80 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62 6c  root of its tabl
19e90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72  e..**.** The vir
19ea0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
19eb0 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
19ec0 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e  for most tables.
19ed0 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65    But.** for the
19ee0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e   table rooted on
19ef0 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d   page 1, sometim
19f00 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 20  e the real root 
19f10 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79  page.** is empty
19f20 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
19f30 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20  right-pointer.  
19f40 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 68  In such cases th
19f50 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  e.** virtual roo
19f60 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  t page is the pa
19f70 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ge that the righ
19f80 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61 67  t-pointer of pag
19f90 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74 69  e.** 1 is pointi
19fa0 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ng to..*/.int sq
19fb0 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74  lite3BtreeIsRoot
19fc0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
19fd0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
19fe0 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73  *pParent;..  ass
19ff0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a000 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1a010 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1a020 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
1a030 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66 28 20  >pParent;.  if( 
1a040 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72 65 74  pParent==0 ) ret
1a050 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50 61  urn 1;.  if( pPa
1a060 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72  rent->pgno>1 ) r
1a070 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 67  eturn 0;.  if( g
1a080 65 74 32 62 79 74 65 28 26 70 50 61 72 65 6e 74  et2byte(&pParent
1a090 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
1a0a0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d  >hdrOffset+3])==
1a0b0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1a0c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1a0d0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a0e0 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
1a0f0 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
1a100 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
1a110 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
1a120 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
1a130 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1a140 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
1a150 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
1a160 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
1a170 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
1a180 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
1a190 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
1a1a0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
1a1b0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
1a1c0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
1a1d0 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
1a1e0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1a1f0 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
1a200 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
1a210 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65  e *pParent;.  Me
1a220 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
1a230 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a  int idxParent;..
1a240 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a250 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1a270 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a280 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50  OR_VALID );.  pP
1a290 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1a2a0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
1a2b0 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
1a2c0 74 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  t( !sqlite3Btree
1a2d0 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  IsRootPage(pPage
1a2e0 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d  ) );.  pParent =
1a2f0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b   pPage->pParent;
1a300 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
1a310 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64 78 50 61  nt!=0 );.  idxPa
1a320 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69 64  rent = pPage->id
1a330 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74  xParent;.  sqlit
1a340 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
1a350 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
1a360 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1a370 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67  e);.  pCur->pPag
1a380 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 70  e = pParent;.  p
1a390 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a3a0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1a3b0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 61 73  idNKey = 0;.  as
1a3c0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
1a3d0 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20  dxShift==0 );.  
1a3e0 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50  pCur->idx = idxP
1a3f0 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arent;.}../*.** 
1a400 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a410 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
1a420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1a430 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
1a440 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
1a450 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
1a460 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a470 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
1a480 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1a490 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a4a0 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
1a4b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1a4c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1a4d0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
1a4e0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
1a4f0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1a500 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
1a510 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
1a520 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1a530 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1a540 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
1a550 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1a560 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a570 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
1a580 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
1a590 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a5a0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
1a5b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
1a5c0 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20  r->skip;.    }. 
1a5d0 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
1a5e0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1a5f0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
1a600 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
1a610 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70  Root && pRoot->p
1a620 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
1a630 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  oot ){.    asser
1a640 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  t( pRoot->isInit
1a650 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1a660 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49   if( .      SQLI
1a670 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74  TE_OK!=(rc = get
1a680 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
1a690 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
1a6a0 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20   &pRoot, 0)).   
1a6b0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1a6c0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1a6d0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
1a6e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a6f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a700 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
1a710 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1a720 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pRoot;.  }.  pCu
1a730 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
1a740 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1a750 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
1a760 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
1a770 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1a780 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
1a790 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
1a7a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1a7b0 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73   subpage;.    as
1a7c0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1a7d0 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70  o==1 );.    subp
1a7e0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1a7f0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
1a800 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
1a810 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1a820 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  ubpage>0 );.    
1a830 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1a840 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
1a850 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1a860 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
1a870 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
1a880 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70  tate = ((pCur->p
1a890 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Page->nCell>0)?C
1a8a0 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
1a8b0 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72  OR_INVALID);.  r
1a8c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a8d0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a8e0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
1a8f0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
1a900 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
1a910 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
1a920 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
1a930 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
1a940 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
1a950 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
1a960 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
1a970 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
1a980 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
1a990 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1a9a0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
1a9b0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
1a9c0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
1a9d0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
1a9e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
1a9f0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1aa00 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1aa10 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1aa20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1aa30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1aa40 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1aa50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1aa60 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
1aa70 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
1aa80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1aa90 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
1aaa0 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
1aab0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
1aac0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
1aad0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1aae0 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72 63  r->idx));.    rc
1aaf0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1ab00 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1ab10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ab20 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1ab30 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1ab40 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
1ab50 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1ab60 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
1ab70 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1ab80 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
1ab90 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
1aba0 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
1abb0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1abc0 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
1abd0 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
1abe0 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
1abf0 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
1ac00 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1ac10 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
1ac20 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
1ac30 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1ac40 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1ac50 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1ac60 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
1ac70 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1ac80 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
1ac90 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
1aca0 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
1acb0 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
1acc0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1acd0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
1ace0 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
1acf0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1ad00 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1ad10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1ad20 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1ad30 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ad40 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1ad50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1ad60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ad70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
1ad80 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1ad90 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
1ada0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
1adb0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
1adc0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1add0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1ade0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1adf0 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67  pCur->idx = pPag
1ae00 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
1ae10 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1ae20 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1ae30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ae40 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
1ae50 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  >idx = pPage->nC
1ae60 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 75  ell - 1;.    pCu
1ae70 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1ae80 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
1ae90 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  idNKey = 0;.  }.
1aea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aeb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
1aec0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1aed0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1aee0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1aef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1af00 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1af10 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1af20 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1af30 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1af40 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1af50 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1af60 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1af70 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1af80 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
1af90 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1afa0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1afb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1afc0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1afd0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1afe0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1aff0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1b000 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1b010 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
1b020 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
1b030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b040 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1b050 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1b060 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
1b070 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1b080 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1b090 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1b0a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b0b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1b0c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b0d0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1b0e0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
1b0f0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
1b100 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
1b110 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
1b120 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b130 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1b140 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
1b150 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1b160 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1b170 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1b180 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1b190 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1b1a0 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1b1b0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1b1c0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1b1d0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1b1e0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1b1f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b200 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
1b210 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1b220 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
1b230 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b240 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b250 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1b260 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1b270 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1b280 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1b290 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1b2a0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1b2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1b2c0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1b2d0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1b2e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b2f0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1b300 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
1b310 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
1b320 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1b330 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1b340 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1b350 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1b360 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
1b370 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1b380 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74 43 65  ur);.      getCe
1b390 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1b3a0 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
1b3b0 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   = rc==SQLITE_OK
1b3c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b3d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1b3e0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
1b3f0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1b400 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
1b410 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
1b420 65 63 69 66 69 65 64 20 62 79 20 70 4b 65 79 2f  ecified by pKey/
1b430 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e 20 52 65 74  nKey/pUnKey. Ret
1b440 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
1b450 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
1b460 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c  TKEY tables, onl
1b470 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61 6d  y the nKey param
1b480 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
1b490 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 70 55 6e 4b  Key .** and pUnK
1b4a0 65 79 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ey must be NULL.
1b4b0 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
1b4c0 65 73 2c 20 65 69 74 68 65 72 20 70 55 6e 4b 65  es, either pUnKe
1b4d0 79 0a 2a 2a 20 6d 75 73 74 20 70 6f 69 6e 74 20  y.** must point 
1b4e0 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 68 61  to a key that ha
1b4f0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  s already been u
1b500 6e 70 61 63 6b 65 64 2c 20 6f 72 20 65 6c 73 65  npacked, or else
1b510 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65 79 20 64 65  .** pKey/nKey de
1b520 73 63 72 69 62 65 73 20 61 20 62 6c 6f 62 20 63  scribes a blob c
1b530 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6b 65  ontaining the ke
1b540 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  y..**.** If an e
1b550 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
1b560 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
1b570 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
1b580 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
1b590 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
1b5a0 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
1b5b0 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
1b5c0 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
1b5d0 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
1b5e0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1b5f0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
1b600 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
1b610 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
1b620 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
1b630 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68   of comparing th
1b640 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
1b650 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
1b660 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77  e.** cursor is w
1b670 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20  ritten to *pRes 
1b680 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20  if pRes!=NULL.  
1b690 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a  The meaning of.*
1b6a0 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  * this value is 
1b6b0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1b6c0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
1b6d0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1b6e0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1b6f0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1b700 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b710 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
1b720 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74  han pKey or if t
1b730 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1b740 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
1b750 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
1b760 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
1b770 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
1b780 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
1b790 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
1b7a0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1b7b0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1b7c0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
1b7f0 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   pKey..**.**    
1b800 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
1b810 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1b820 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1b830 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1b850 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b  s larger than pK
1b860 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
1b870 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
1b880 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1b890 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ur,        /* Th
1b8a0 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
1b8b0 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oved */.  const 
1b8c0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
1b8d0 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f 6e 74   /* The key cont
1b8e0 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65 73 2e  ent for indices.
1b8f0 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20 74 61    Not used by ta
1b900 62 6c 65 73 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  bles */.  Unpack
1b910 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 4b 65 79  edRecord *pUnKey
1b920 2c 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72  ,/* Unpacked ver
1b930 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 2a 2f 0a  sion of pKey */.
1b940 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
1b950 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b960 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74 68   of pKey.  Or th
1b970 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73  e key for tables
1b980 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
1b990 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ght,         /* 
1b9a0 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
1b9b0 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
1b9c0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1b9d0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1b9e0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 72       /* Search r
1b9f0 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b  esult flag */.){
1ba00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1ba10 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 0a 0a  r aSpace[200];..
1ba20 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ba30 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ba40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1ba50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ba60 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1ba70 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
1ba80 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
1ba90 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
1baa0 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
1bab0 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
1bac0 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
1bad0 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
1bae0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1baf0 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
1bb00 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1bb10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
1bb20 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65  & pCur->validNKe
1bb30 79 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  y && pCur->pPage
1bb40 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1bb50 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1bb60 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  Key==nKey ){.   
1bb70 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1bb80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bb90 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1bba0 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  if( pCur->atLast
1bbb0 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
1bbc0 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key<nKey ){.    
1bbd0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
1bbe0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bbf0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1bc00 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
1bc10 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1bc20 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1bc30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1bc40 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
1bc50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1bc60 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  r->pPage->isInit
1bc70 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1bc80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1bc90 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
1bca0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
1bcb0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1bcc0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1bcd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bce0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1bcf0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
1bd00 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  ey ){.    /* We 
1bd10 61 72 65 20 67 69 76 65 6e 20 61 6e 20 53 51 4c  are given an SQL
1bd20 20 74 61 62 6c 65 20 74 6f 20 73 65 61 72 63 68   table to search
1bd30 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 74 68  .  The key is th
1bd40 65 20 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a  e integer.    **
1bd50 20 72 6f 77 69 64 20 63 6f 6e 74 61 69 6e 65 64   rowid contained
1bd60 20 69 6e 20 6e 4b 65 79 2e 20 20 70 4b 65 79 20   in nKey.  pKey 
1bd70 61 6e 64 20 70 55 6e 4b 65 79 20 73 68 6f 75 6c  and pUnKey shoul
1bd80 64 20 62 6f 74 68 20 62 65 20 4e 55 4c 4c 20 2a  d both be NULL *
1bd90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 55  /.    assert( pU
1bda0 6e 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nKey==0 );.    a
1bdb0 73 73 65 72 74 28 20 70 4b 65 79 3d 3d 30 20 29  ssert( pKey==0 )
1bdc0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 55  ;.  }else if( pU
1bdd0 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nKey==0 ){.    /
1bde0 2a 20 57 65 20 61 72 65 20 74 6f 20 73 65 61 72  * We are to sear
1bdf0 63 68 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  ch an SQL index 
1be00 75 73 69 6e 67 20 61 20 6b 65 79 20 65 6e 63 6f  using a key enco
1be10 64 65 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ded as a blob.. 
1be20 20 20 20 2a 2a 20 54 68 65 20 62 6c 6f 62 20 69     ** The blob i
1be30 73 20 66 6f 75 6e 64 20 61 74 20 70 4b 65 79 20  s found at pKey 
1be40 61 6e 64 20 69 73 20 6e 4b 65 79 20 62 79 74 65  and is nKey byte
1be50 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 20 55 6e  s in length.  Un
1be60 70 61 63 6b 0a 20 20 20 20 2a 2a 20 74 68 69 73  pack.    ** this
1be70 20 6b 65 79 20 73 6f 20 74 68 61 74 20 77 65 20   key so that we 
1be80 63 61 6e 20 75 73 65 20 69 74 2e 20 2a 2f 0a 20  can use it. */. 
1be90 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21     assert( pKey!
1bea0 3d 30 20 29 3b 0a 20 20 20 20 70 55 6e 4b 65 79  =0 );.    pUnKey
1beb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1bec0 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
1bed0 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c  >pKeyInfo, nKey,
1bee0 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20   pKey,.         
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63 65            aSpace
1bf10 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
1bf20 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 4b 65  );.    if( pUnKe
1bf30 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
1bf40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
1bf50 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  lse{.    /* We a
1bf60 72 65 20 74 6f 20 73 65 61 72 63 68 20 61 6e 20  re to search an 
1bf70 53 51 4c 20 69 6e 64 65 78 20 75 73 69 6e 67 20  SQL index using 
1bf80 61 20 6b 65 79 20 74 68 61 74 20 69 73 20 61 6c  a key that is al
1bf90 72 65 61 64 79 20 75 6e 70 61 63 6b 65 64 0a 20  ready unpacked. 
1bfa0 20 20 20 2a 2a 20 61 6e 64 20 68 61 6e 64 65 64     ** and handed
1bfb0 20 74 6f 20 75 73 20 69 6e 20 70 55 6e 4b 65 79   to us in pUnKey
1bfc0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1bfd0 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 7d 0a   pKey==0 );.  }.
1bfe0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
1bff0 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
1c000 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
1c010 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1c020 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1c030 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20      int c = -1; 
1c040 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20   /* pRes return 
1c050 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  if table is empt
1c060 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a  y must be -1 */.
1c070 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
1c080 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
1c090 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21  ell-1;.    if( !
1c0a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1c0b0 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20   pUnKey==0 ){.  
1c0c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c0d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c0e0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1c0f0 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
1c100 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
1c110 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  ){.      pCur->i
1c120 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65  dx = upr;.    }e
1c130 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
1c140 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29  >idx = (upr+lwr)
1c150 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  /2;.    }.    if
1c160 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72  ( lwr<=upr ) for
1c170 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  (;;){.      void
1c180 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
1c190 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
1c1a0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1c1b0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1c1c0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1c1d0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  y = 1;.      if(
1c1e0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1c1f0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43  {.        u8 *pC
1c200 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
1c210 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1c220 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1c230 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1c240 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1c250 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1c260 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1c270 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1c280 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1c290 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1c2a0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
1c2b0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
1c2c0 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
1c2d0 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
1c2e0 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
1c2f0 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  y==nKey ){.     
1c300 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
1c310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
1c320 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20  ellKey<nKey ){. 
1c330 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
1c340 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1c350 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1c360 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20  ( nCellKey>nKey 
1c370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
1c380 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1c390 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c3a0 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c      int availabl
1c3b0 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e;.        pCell
1c3c0 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65  Key = (void *)fe
1c3d0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
1c3e0 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b   &available, 0);
1c3f0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65  .        nCellKe
1c400 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
1c410 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
1c420 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c   available>=nCel
1c430 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  lKey ){.        
1c440 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
1c450 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1c460 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1c470 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20 20 20  y, pUnKey);.    
1c480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c490 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
1c4a0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
1c4b0 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20  CellKey );.     
1c4c0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
1c4d0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
1c4e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c4f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
1c500 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
1c510 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
1c520 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1c530 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
1c540 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  y(pCur, 0, nCell
1c550 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65  Key, (void *)pCe
1c560 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
1c570 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
1c580 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1c590 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1c5a0 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20 20 20  y, pUnKey);.    
1c5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1c5c0 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
1c5d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1c5e0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1c5f0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
1c600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c610 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1c620 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1c630 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
1c640 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1c650 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
1c660 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1c670 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e      lwr = pCur->
1c680 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
1c690 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
1c6a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c6b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c6c0 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73          if( pRes
1c6d0 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20   ) *pRes = 0;.  
1c6e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c6f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1c700 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
1c710 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
1c720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c730 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
1c740 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   lwr = pCur->idx
1c750 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1c760 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 70  .        upr = p
1c770 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20  Cur->idx-1;.    
1c780 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77    }.      if( lw
1c790 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20  r>upr ){.       
1c7a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1c7b0 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
1c7c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c7d0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
1c7e0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
1c7f0 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  2;.    }.    ass
1c800 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
1c810 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c820 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1c830 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1c840 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
1c850 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
1c860 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
1c870 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1c880 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1c890 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1c8a0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1c8b0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
1c8c0 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
1c8d0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
1c8e0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
1c8f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c900 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
1c910 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1c920 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
1c930 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
1c940 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
1c950 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
1c960 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
1c970 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c980 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
1c990 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
1c9a0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72   pCur->idx = lwr
1c9b0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1c9c0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1c9d0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1c9e0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
1c9f0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1ca00 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
1ca10 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
1ca20 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
1ca30 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 69  veto_finish:.  i
1ca40 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 2f  f( pKey ){.    /
1ca50 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
1ca60 6f 75 72 20 6f 77 6e 20 75 6e 70 61 63 6b 65 64  our own unpacked
1ca70 20 6b 65 79 20 61 74 20 74 68 65 20 74 6f 70 20   key at the top 
1ca80 6f 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  of this.    ** p
1ca90 72 6f 63 65 64 75 72 65 2c 20 74 68 65 6e 20 64  rocedure, then d
1caa0 65 73 74 72 6f 79 20 74 68 61 74 20 6b 65 79 20  estroy that key 
1cab0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1cac0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1cad0 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
1cae0 65 64 52 65 63 6f 72 64 28 70 55 6e 4b 65 79 29  edRecord(pUnKey)
1caf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cb00 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
1cb10 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1cb20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1cb30 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1cb40 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
1cb50 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
1cb60 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
1cb70 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
1cb80 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
1cb90 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
1cba0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1cbb0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
1cbc0 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
1cbd0 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
1cbe0 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
1cbf0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
1cc00 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
1cc10 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1cc20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1cc30 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
1cc40 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
1cc50 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
1cc60 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
1cc70 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
1cc80 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
1cc90 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
1cca0 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
1ccb0 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
1ccc0 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
1ccd0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
1cce0 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
1ccf0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
1cd00 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
1cd10 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
1cd20 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
1cd30 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
1cd40 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
1cd50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
1cd60 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72  dle for a cursor
1cd70 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1cd80 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1cd90 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72 73 6f  Db(const BtCurso
1cda0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
1cdb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1cdc0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1cdd0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1cde0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
1cdf0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a  ->pBtree->db;.}.
1ce00 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
1ce10 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1ce20 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
1ce30 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1ce40 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1ce50 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1ce60 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1ce70 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1ce80 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
1ce90 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1cea0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1ceb0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1cec0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1ced0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1cee0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1cef0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
1cf00 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1cf10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
1cf20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1cf30 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1cf40 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1cf50 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1cf60 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1cf70 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1cf80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cf90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cfa0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  }.  assert( pRes
1cfb0 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  !=0 );.  pPage =
1cfc0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1cfd0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1cfe0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1cff0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1d000 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1d010 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1d020 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20  f( pCur->skip>0 
1d030 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
1d040 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
1d050 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1d060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d070 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1d080 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1d090 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1d0a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1d0b0 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
1d0c0 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b  ;..  pCur->idx++
1d0d0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1d0e0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1d0f0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1d100 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
1d110 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1d120 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
1d130 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1d140 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1d150 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
1d160 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1d170 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1d180 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
1d190 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1d1a0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1d1b0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1d1c0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1d1d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1d1e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
1d1f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d200 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65  3BtreeIsRootPage
1d210 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  (pPage) ){.     
1d220 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1d230 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1d240 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1d250 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
1d260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1d280 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
1d290 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
1d2a0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
1d2b0 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69  >pPage;.    }whi
1d2c0 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  le( pCur->idx>=p
1d2d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1d2e0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1d2f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1d300 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
1d310 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
1d320 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
1d330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d350 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1d360 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
1d370 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
1d380 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1d390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d3a0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
1d3b0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1d3c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d3d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
1d3e0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1d3f0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
1d400 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
1d410 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1d420 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1d430 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1d440 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1d450 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1d460 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
1d470 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
1d480 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
1d490 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1d4a0 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
1d4b0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
1d4c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d4d0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
1d4e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1d4f0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1d500 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  ;.  Pgno pgno;. 
1d510 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1d520 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1d530 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d540 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1d550 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1d560 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1d570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d580 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1d590 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61    }.  pCur->atLa
1d5a0 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55  st = 0;.  if( CU
1d5b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1d5c0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1d5d0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1d5e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d5f0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
1d600 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20  r->skip<0 ){.   
1d610 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1d620 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1d630 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d640 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1d650 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70  ->skip = 0;..  p
1d660 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1d670 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
1d680 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1d690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1d6a0 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  dx>=0 );.  if( !
1d6b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1d6c0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1d6d0 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  te( findCell(pPa
1d6e0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29  ge, pCur->idx) )
1d6f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1d700 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
1d710 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
1d720 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1d730 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1d740 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1d750 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
1d760 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
1d770 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20  r->idx==0 ){.   
1d780 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
1d790 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
1d7a0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
1d7b0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1d7c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1d7d0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1d7e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d7f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d800 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d810 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1d820 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
1d830 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1d840 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  age;.    }.    p
1d850 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20  Cur->idx--;.    
1d860 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1d870 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
1d880 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1d890 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1d8a0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
1d8b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1d8c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1d8d0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
1d8e0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
1d8f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d900 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1d910 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
1d920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d930 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
1d940 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
1d950 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1d960 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
1d970 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
1d980 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
1d990 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
1d9a0 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
1d9b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d9c0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
1d9d0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
1d9e0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
1d9f0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
1da00 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
1da10 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
1da20 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
1da30 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
1da40 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
1da50 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
1da60 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
1da70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1da80 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1da90 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
1daa0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1dab0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
1dac0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
1dad0 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
1dae0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
1daf0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
1db00 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
1db10 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
1db20 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
1db30 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1db40 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1db50 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
1db60 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
1db70 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
1db80 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
1db90 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
1dba0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
1dbb0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1dbc0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
1dbd0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
1dbe0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
1dbf0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
1dc00 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
1dc10 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
1dc20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
1dc30 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
1dc40 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
1dc50 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
1dc60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
1dc70 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
1dc80 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
1dc90 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
1dca0 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
1dcb0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
1dcc0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
1dcd0 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
1dce0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
1dcf0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
1dd00 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
1dd10 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
1dd20 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
1dd30 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
1dd40 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1dd50 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
1dd60 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
1dd70 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1dd80 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
1dd90 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
1dda0 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
1ddb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1ddc0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  1;.  int rc;.  i
1ddd0 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt n;     /* Num
1dde0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1ddf0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
1de00 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20    int k;     /* 
1de10 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
1de20 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
1de30 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
1de40 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
1de50 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
1de60 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
1de70 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
1de80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1de90 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1dea0 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
1deb0 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65  pPage1;.  n = ge
1dec0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1ded0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66  aData[36]);.  if
1dee0 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
1def0 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
1df00 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
1df10 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
1df20 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
1df30 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
1df40 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
1df50 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
1df60 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
1df70 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
1df80 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
1df90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27  .    /* If the '
1dfa0 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72  exact' parameter
1dfb0 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20   was true and a 
1dfc0 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
1dfd0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
1dfe0 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
1dff0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
1e000 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
1e010 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
1e020 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
1e030 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
1e040 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
1e050 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
1e060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e070 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1e080 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e    if( exact && n
1e090 65 61 72 62 79 3c 3d 70 61 67 65 72 50 61 67 65  earby<=pagerPage
1e0a0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1e0b0 72 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  r) ){.      u8 e
1e0c0 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
1e0d0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
1e0e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1e0f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
1e100 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1e110 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
1e120 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
1e130 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1e140 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
1e150 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1e160 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1e170 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1e180 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1e190 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
1e1a0 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
1e1b0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
1e1c0 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
1e1d0 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
1e1e0 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
1e1f0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
1e200 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
1e210 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
1e220 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
1e230 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
1e240 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e250 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1e260 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1e270 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e280 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
1e290 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e2a0 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
1e2b0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
1e2c0 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
1e2d0 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
1e2e0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
1e2f0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
1e300 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
1e310 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
1e320 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1e330 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
1e340 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
1e350 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
1e360 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
1e370 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
1e380 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
1e390 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
1e3a0 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
1e3b0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1e3c0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
1e3d0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1e3e0 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
1e3f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e400 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1e410 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1e420 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
1e430 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
1e440 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1e450 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
1e460 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
1e470 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e480 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1e490 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1e4a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1e4b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
1e4c0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1e4d0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
1e4e0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
1e4f0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
1e500 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1e510 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
1e520 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
1e530 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
1e540 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
1e550 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
1e560 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
1e570 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
1e580 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
1e590 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
1e5a0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
1e5b0 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
1e5c0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
1e5d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e5e0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1e5f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e600 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e610 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1e620 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1e630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e640 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
1e650 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
1e660 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1e670 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1e680 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1e690 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1e6a0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
1e6b0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1e6c0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1e6d0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
1e6e0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
1e6f0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
1e700 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
1e710 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61  e if( k>pBt->usa
1e720 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
1e730 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
1e740 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
1e750 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
1e760 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
1e770 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e780 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e790 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1e7a0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1e7b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1e7c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e7d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e7e0 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
1e7f0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
1e800 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1e810 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
1e820 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
1e830 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
1e840 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1e850 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
1e860 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
1e870 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
1e880 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1e890 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
1e8a0 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
1e8b0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1e8c0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1e8d0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1e8e0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
1e8f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e900 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1e910 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1e920 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1e930 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1e940 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1e950 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
1e960 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e970 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1e980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1e990 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1e9a0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1e9b0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1e9c0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1e9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1e9e0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
1e9f0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1ea00 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1ea10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1ea20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ea30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1ea40 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
1ea50 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
1ea60 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
1ea70 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
1ea80 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
1ea90 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
1eaa0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
1eab0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
1eac0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
1ead0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
1eae0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1eaf0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1eb00 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
1eb10 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
1eb20 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1eb30 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
1eb40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1eb50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1eb60 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
1eb70 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
1eb80 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
1eb90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1eba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ebb0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1ebc0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1ebd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1ebe0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1ebf0 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
1ec00 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1ec10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ec20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ec30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1ec40 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1ec50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1ec60 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1ec70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ec80 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1ec90 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1eca0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1ecb0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1ecc0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ecd0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1ece0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1ecf0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1ed00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
1ed10 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1ed20 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
1ed30 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1ed40 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1ed50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1ed60 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1ed70 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1ed80 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1ed90 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
1eda0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1edb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1edc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1edd0 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
1ede0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1edf0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1ee00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ee10 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1ee20 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1ee30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ee40 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
1ee50 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1ee60 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1ee70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ee80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
1ee90 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1eea0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1eeb0 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1eec0 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1eed0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1eee0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
1eef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ef00 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
1ef10 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
1ef20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1ef30 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
1ef40 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
1ef50 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
1ef60 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
1ef70 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
1ef80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ef90 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1efa0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1efb0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1efc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1efd0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1efe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eff0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
1f000 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1f010 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
1f020 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1f030 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1f040 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1f050 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
1f060 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
1f070 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
1f080 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
1f090 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
1f0a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1f0b0 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
1f0c0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
1f0d0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1f0e0 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
1f0f0 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
1f100 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
1f110 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1f120 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1f140 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
1f150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f160 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1f170 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
1f180 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1f190 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
1f1a0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
1f1b0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
1f1c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1f1d0 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
1f1e0 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
1f1f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61           int nPa
1f200 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  ge;.          *p
1f210 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
1f220 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20          nPage = 
1f230 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1f240 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1f250 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e         if( *pPgn
1f260 6f 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  o>nPage ){.     
1f270 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70         /* Free p
1f280 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20  age off the end 
1f290 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1f2a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1f2b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f2c0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
1f2d0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1f2e0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1f2f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54     }.          T
1f300 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1f310 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
1f320 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
1f330 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
1f340 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
1f350 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f370 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
1f380 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
1f390 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
1f3a0 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
1f3b0 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
1f3c0 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
1f3d0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
1f3e0 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
1f3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f400 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f410 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
1f420 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f430 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1f440 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1f450 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  , ppPage, 1);.  
1f460 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f480 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f490 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1f4a0 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  k((*ppPage)->pDb
1f4b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1f4c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f4d0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1f4e0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1f4f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1f500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1f520 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1f530 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f540 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1f550 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1f560 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1f570 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1f580 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1f590 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
1f5a0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
1f5b0 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
1f5c0 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
1f5d0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
1f5e0 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
1f5f0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
1f600 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
1f610 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
1f620 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1f630 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
1f640 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
1f650 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
1f660 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61      *pPgno = nPa
1f670 67 65 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66  ge + 1;..#ifndef
1f680 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f690 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1f6a0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
1f6b0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d       /* An incr-
1f6c0 76 61 63 75 75 6d 20 68 61 73 20 61 6c 72 65 61  vacuum has alrea
1f6d0 64 79 20 72 75 6e 20 77 69 74 68 69 6e 20 74 68  dy run within th
1f6e0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
1f6f0 53 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  So the.      ** 
1f700 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  page to allocate
1f710 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65   is not from the
1f720 20 70 68 79 73 69 63 61 6c 20 65 6e 64 20 6f 66   physical end of
1f730 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74 0a 20   the file, but. 
1f740 20 20 20 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e       ** at pBt->
1f750 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a  nTrunc. .      *
1f760 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  /.      *pPgno =
1f770 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a   pBt->nTrunc+1;.
1f780 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
1f790 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1f7a0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1f7b0 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
1f7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f7d0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1f7e0 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
1f7f0 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67  ISPAGE(pBt, *pPg
1f800 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  no) ){.      /* 
1f810 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
1f820 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
1f830 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
1f840 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
1f850 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
1f860 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
1f870 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
1f880 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
1f890 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
1f8a0 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
1f8b0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
1f8c0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
1f8d0 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
1f8e0 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
1f8f0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1f900 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
1f910 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
1f920 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
1f930 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
1f940 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1f950 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1f960 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28  (pBt) );.      (
1f970 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  *pPgno)++;.     
1f980 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
1f990 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f9a0 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b  Bt) ){ (*pPgno)+
1f9b0 2b 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69  +; }.    }.    i
1f9c0 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29  f( pBt->nTrunc )
1f9d0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
1f9e0 75 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20  unc = *pPgno;.  
1f9f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1fa00 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
1fa10 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1fa20 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
1fa30 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1fa40 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
1fa50 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
1fa60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1fa70 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1fa80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1fa90 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
1faa0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1fab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fac0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1fad0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
1fae0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
1faf0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
1fb00 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
1fb10 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
1fb20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
1fb30 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1fb40 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
1fb50 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
1fb60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1fb70 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
1fb80 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
1fb90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1fba0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61  ../*.** Add a pa
1fbb0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1fbc0 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66  se file to the f
1fbd0 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73  reelist..**.** s
1fbe0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1fbf0 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64  () is NOT called
1fc00 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
1fc10 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
1fc20 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
1fc30 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
1fc40 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1fc50 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1fc60 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1fc70 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20  1;.  int rc, n, 
1fc80 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65  k;..  /* Prepare
1fc90 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72   the page for fr
1fca0 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72  eeing */.  asser
1fcb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1fcc0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1fcd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1fce0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
1fcf0 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  o>1 );.  pPage->
1fd00 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65  isInit = 0;.  re
1fd10 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 2d  leasePage(pPage-
1fd20 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61  >pParent);.  pPa
1fd30 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
1fd40 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1fd50 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
1fd60 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
1fd70 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1fd80 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1fd90 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
1fda0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1fdb0 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  c;.  n = get4byt
1fdc0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1fdd0 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
1fde0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1fdf0 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66  [36], n+1);..#if
1fe00 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
1fe10 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
1fe20 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
1fe30 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
1fe40 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
1fe50 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
1fe60 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
1fe70 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
1fe80 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
1fe90 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
1fea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1feb0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
1fec0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
1fed0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1fee0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
1fef0 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
1ff00 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
1ff10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1ff20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1ff30 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
1ff40 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
1ff50 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
1ff60 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
1ff70 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
1ff80 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
1ff90 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
1ffa0 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
1ffb0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1ffc0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1ffd0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
1ffe0 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  t, pPage->pgno, 
1fff0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
20000 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
20010 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
20020 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
20030 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
20040 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
20050 66 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20  free page */.   
20060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20070 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
20080 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
20090 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
200a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
200b0 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b  e->aData, 0, 8);
200c0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
200d0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
200e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
200f0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
20100 2d 50 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c  -PAGE: %d first\
20110 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  n", pPage->pgno)
20120 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20130 2f 2a 20 4f 74 68 65 72 20 66 72 65 65 20 70 61  /* Other free pa
20140 67 65 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  ges already exis
20150 74 2e 20 20 52 65 74 72 69 76 65 20 74 68 65 20  t.  Retrive the 
20160 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
20170 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
20180 72 65 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64  reelist and find
20190 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65   out how many le
201a0 61 76 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a  aves it has. */.
201b0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72      MemPage *pTr
201c0 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  unk;.    rc = sq
201d0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
201e0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
201f0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
20200 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  2]), &pTrunk, 0)
20210 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
20220 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20  eturn rc;.    k 
20230 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
20240 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
20250 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75     if( k>=pBt->u
20260 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
20270 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
20280 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20  trunk is full.  
20290 54 75 72 6e 20 74 68 65 20 70 61 67 65 20 62 65  Turn the page be
202a0 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61  ing freed into a
202b0 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72   new.      ** tr
202c0 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f  unk page with no
202d0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 2a   leaves..      *
202e0 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
202f0 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
20300 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
20310 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
20320 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
20330 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
20340 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
20350 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
20360 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
20370 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
20380 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
20390 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
203a0 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
203b0 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
203c0 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
203d0 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
203e0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
203f0 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
20400 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
20410 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
20420 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
20430 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
20440 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
20450 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
20460 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
20470 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
20480 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
20490 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
204a0 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  * we will contai
204b0 6e 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  n to restrict th
204c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
204d0 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
204e0 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
204f0 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
20500 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
20510 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
20520 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
20530 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
20540 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
20550 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
20560 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
20570 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
20580 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
20590 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
205a0 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
205b0 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
205c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
205d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
205e0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
205f0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
20600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20610 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
20620 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70  (pPage->aData, p
20630 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20  Trunk->pgno);.  
20640 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
20650 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
20660 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74   0);.        put
20670 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
20680 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
20690 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
206a0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
206b0 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
206c0 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
206d0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
206e0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
206f0 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  o, pTrunk->pgno)
20700 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20710 65 6c 73 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a  else if( k<0 ){.
20720 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20730 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  E_CORRUPT;.    }
20740 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
20750 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65  dd the newly fre
20760 65 64 20 70 61 67 65 20 61 73 20 61 20 6c 65 61  ed page as a lea
20770 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  f on the current
20780 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
20790 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
207a0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
207b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
207c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
207d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
207e0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
207f0 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20  ata[4], k+1);.  
20800 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
20810 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
20820 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  k*4], pPage->pgn
20830 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o);.#ifndef SQLI
20840 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
20850 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20860 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
20870 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
20880 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
20890 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
208a0 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
208b0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
208c0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
208d0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
208e0 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
208f0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
20900 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20910 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
20920 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
20930 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20940 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
20950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
20960 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
20970 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
20980 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
20990 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
209a0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
209b0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
209c0 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
209d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
209e0 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66  nOvfl;.  int ovf
209f0 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
20a00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20a10 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
20a20 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
20a30 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
20a40 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
20a50 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
20a60 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
20a70 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
20a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20a90 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
20aa0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
20ab0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
20ac0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
20ad0 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
20ae0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
20af0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76  Overflow]);.  ov
20b00 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
20b10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
20b20 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
20b30 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
20b40 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
20b50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
20b60 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
20b70 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
20b80 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
20b90 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
20ba0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
20bb0 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f  pOvfl;.    if( o
20bc0 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76  vflPgno==0 || ov
20bd0 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  flPgno>pagerPage
20be0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
20bf0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
20c00 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20c10 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
20c20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
20c30 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
20c40 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28  lPgno, &pOvfl, (
20c50 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66  nOvfl==0)?0:&ovf
20c60 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
20c70 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20c80 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
20c90 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
20ca0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20cb0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
20cc0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
20cd0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
20ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
20d00 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
20d10 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
20d20 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
20d30 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
20d40 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
20d50 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
20d60 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
20d70 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
20d80 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
20d90 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
20da0 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
20db0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
20dc0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
20dd0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
20de0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
20df0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
20e00 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
20e10 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
20e20 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
20e30 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
20e40 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
20e50 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
20e60 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
20e70 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
20e80 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
20e90 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
20ea0 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
20eb0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
20ec0 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
20ed0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
20ee0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
20ef0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
20f00 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
20f10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f30 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
20f40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
20f50 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
20f60 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
20f70 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
20f80 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
20f90 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
20fa0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
20fb0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
20fc0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
20fd0 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
20fe0 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
20ff0 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
21000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21010 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
21020 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
21030 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
21040 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21060 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
21070 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
21080 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
21090 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
210a0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
210b0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
210c0 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
210d0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
210e0 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
210f0 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
21100 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
21110 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21120 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
21130 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
21140 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
21150 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
21160 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
21170 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
21180 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21190 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
211a0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
211b0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
211c0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
211d0 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
211e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
211f0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
21200 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
21210 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
21220 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
21230 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
21240 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
21250 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
21260 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
21270 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
21280 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
21290 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
212a0 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
212b0 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  y);.  sqlite3Btr
212c0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
212d0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
212e0 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
212f0 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
21300 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
21310 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
21320 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
21330 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61  nfo.nData==nData
21340 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f  +nZero );.  .  /
21350 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
21360 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
21370 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
21380 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
21390 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
213a0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
213b0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
213c0 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
213d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
213e0 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
213f0 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
21400 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a     nSrc = nKey;.
21410 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
21420 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
21430 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
21440 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
21450 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
21460 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
21470 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
21480 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
21490 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
214a0 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
214b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t==0 ){.      in
214c0 74 20 69 73 45 78 61 63 74 20 3d 20 30 3b 0a 23  t isExact = 0;.#
214d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
214e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
214f0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
21500 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
21510 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
21520 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
21530 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
21540 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
21550 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
21560 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
21570 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
21580 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
21590 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
215a0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
215b0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
215c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
215d0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
215e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
215f0 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20  gnoOvfl>1 ){.   
21600 20 20 20 20 20 20 20 2f 2a 20 69 73 45 78 61 63         /* isExac
21610 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20  t = 1; */.      
21620 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
21630 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
21640 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
21650 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
21660 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
21670 2c 20 69 73 45 78 61 63 74 29 3b 0a 23 69 66 6e  , isExact);.#ifn
21680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21690 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
216a0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
216b0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
216c0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
216d0 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
216e0 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
216f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
21700 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
21710 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
21720 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
21730 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
21740 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
21750 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
21760 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
21770 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
21780 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
21790 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
217a0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
217b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
217c0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
217d0 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
217e0 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
217f0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
21800 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
21810 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
21820 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
21830 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
21840 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
21850 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
21860 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
21870 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
21880 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
21890 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
218a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
218b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
218c0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
218d0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
218e0 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
218f0 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
21900 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
21910 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OW1);.        rc
21920 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
21930 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
21940 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  e, pgnoPtrmap);.
21950 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
21960 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
21970 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
21980 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21990 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
219a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
219b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
219c0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
219d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
219e0 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
219f0 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
21a00 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
21a10 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
21a20 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
21a30 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
21a40 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
21a50 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
21a60 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
21a70 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
21a80 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
21a90 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
21aa0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
21ab0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
21ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
21ad0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
21ae0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
21af0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  n = spaceLeft;. 
21b00 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
21b10 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
21b20 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
21b30 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
21b40 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
21b50 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
21b60 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
21b70 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
21b80 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
21b90 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
21ba0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
21bb0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
21bc0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
21bd0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
21be0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
21bf0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
21c00 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
21c10 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
21c20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
21c30 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
21c40 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
21c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21c60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
21c70 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72  the MemPage.pPar
21c80 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74  ent pointer on t
21c90 68 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75  he page whose nu
21ca0 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e  mber is.** given
21cb0 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
21cc0 72 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  rgument so that 
21cd0 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20  MemPage.pParent 
21ce0 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69  holds the.** poi
21cf0 6e 74 65 72 20 69 6e 20 74 68 65 20 74 68 69 72  nter in the thir
21d00 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
21d10 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65  tatic int repare
21d20 6e 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20  ntPage(BtShared 
21d30 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pBt, Pgno pgno,
21d40 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
21d50 72 65 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a  rent, int idx){.
21d60 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73    MemPage *pThis
21d70 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
21d80 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
21d90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21da0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
21db0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
21dc0 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
21dd0 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
21de0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21df0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
21e00 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44 62  ager!=0 );.  pDb
21e10 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
21e20 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
21e30 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
21e40 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
21e50 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50     pThis = (MemP
21e60 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
21e70 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
21e80 67 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68  ge);.    if( pTh
21e90 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  is->isInit ){.  
21ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69      assert( pThi
21eb0 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  s->aData==sqlite
21ec0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
21ed0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
21ee0 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
21ef0 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29  nt!=pNewParent )
21f00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
21f10 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73  his->pParent ) s
21f20 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
21f30 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d  (pThis->pParent-
21f40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
21f50 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e     pThis->pParen
21f60 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a  t = pNewParent;.
21f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
21f80 61 67 65 72 52 65 66 28 70 4e 65 77 50 61 72 65  agerRef(pNewPare
21f90 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
21fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69      }.      pThi
21fb0 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69  s->idxParent = i
21fc0 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dx;.    }.    sq
21fd0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
21fe0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23  pDbPage);.  }..#
21ff0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22000 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
22010 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
22020 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72  uum ){.    retur
22030 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  n ptrmapPut(pBt,
22040 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
22050 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d  REE, pNewParent-
22060 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64  >pgno);.  }.#end
22070 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
22080 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
22090 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61  * Change the pPa
220a0 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  rent pointer of 
220b0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
220c0 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62  pPage to point b
220d0 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e  ack.** to pPage.
220e0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
220f0 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79  words, for every
22100 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c   child of pPage,
22110 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74   invoke reparent
22120 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b  Page().** to mak
22130 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68  e sure that each
22140 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61   child knows tha
22150 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70  t pPage is its p
22160 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  arent..**.** Thi
22170 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
22180 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20  alled after you 
22190 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67  memcpy() one pag
221a0 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65  e into.** anothe
221b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
221c0 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
221d0 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ges(MemPage *pPa
221e0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ge){.  int i;.  
221f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22200 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
22210 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22220 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
22230 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22240 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
22250 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
22260 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e  e->leaf ) return
22270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66   SQLITE_OK;..  f
22280 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
22290 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
222a0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
222b0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
222c0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  ;.    rc = repar
222d0 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
222e0 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
222f0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  age, i);.    if(
22300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22310 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
22320 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50    rc = reparentP
22330 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
22340 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
22350 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
22360 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20  +8]), .         
22370 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
22380 2c 20 69 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  , i);.  pPage->i
22390 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72  dxShift = 0;.  r
223a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
223b0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
223c0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
223d0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
223e0 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
223f0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
22400 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
22410 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
22420 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
22430 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
22440 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
22450 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
22460 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
22470 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
22480 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
22490 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
224a0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
224b0 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
224c0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
224d0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
224e0 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
224f0 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
22500 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
22510 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b  nt idx, int sz){
22520 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
22530 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22540 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
22550 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
22560 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
22570 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
22580 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
22590 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
225a0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
225b0 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
225c0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
225d0 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
225e0 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
225f0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
22600 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
22610 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
22620 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
22630 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
22640 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22650 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
22660 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
22670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
22680 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22690 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
226a0 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
226b0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
226c0 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
226d0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
226e0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
226f0 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
22700 61 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26  assert( pc>10 &&
22710 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70   pc+sz<=pPage->p
22720 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
22730 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50  ;.  freeSpace(pP
22740 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
22750 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
22760 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
22770 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
22780 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
22790 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
227a0 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
227b0 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
227c0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
227d0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
227e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
227f0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
22800 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 2;.  pPage->id
22810 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  xShift = 1;.}../
22820 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
22830 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
22840 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
22850 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
22860 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
22870 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
22880 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
22890 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
228a0 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
228b0 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
228c0 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
228d0 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
228e0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
228f0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22900 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
22910 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
22920 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
22930 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
22940 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
22950 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66  * in pPage->aOvf
22960 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
22970 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
22980 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
22990 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
229a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
229b0 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
229c0 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
229d0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
229e0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
229f0 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
22a00 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
22a10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
22a20 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
22a30 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
22a40 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
22a50 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
22a60 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
22a70 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
22a80 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
22a90 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
22aa0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
22ab0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
22ac0 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
22ad0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
22ae0 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
22af0 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
22b00 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
22b10 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
22b20 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
22b30 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  id)..*/.static i
22b40 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  nt insertCell(. 
22b50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
22b60 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
22b70 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
22b80 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
22b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22ba0 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
22bb0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
22bc0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
22bd0 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
22be0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
22bf0 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
22c00 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
22c10 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
22c20 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
22c30 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
22c40 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
22c50 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
22c60 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
22c70 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20  d */.  u8 nSkip 
22c80 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
22c90 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69 72  ot write the fir
22ca0 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
22cb0 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b  f the cell */.){
22cc0 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
22cd0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
22ce0 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
22cf0 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
22d00 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
22d10 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22d20 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
22d30 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
22d40 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
22d50 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
22d60 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20   cell in data[] 
22d70 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
22d80 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22d90 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
22da0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
22db0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
22dc0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
22dd0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
22de0 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
22df0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
22e00 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
22e10 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
22e20 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74   Offset into dat
22e30 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20  a[] of the page 
22e40 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
22e50 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
22e60 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
22e70 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
22e80 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
22e90 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
22ea0 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
22eb0 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
22ec0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
22ed0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
22ee0 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
22ef0 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
22f00 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
22f10 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
22f20 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
22f30 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
22f40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
22f50 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
22f60 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61  e, pCell) );.  a
22f70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22f80 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
22f90 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
22fa0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
22fb0 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
22fc0 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
22fd0 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
22fe0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
22ff0 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
23000 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
23010 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
23020 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
23030 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
23040 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
23050 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50  ert( j<sizeof(pP
23060 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
23070 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
23080 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  0]) );.    pPage
23090 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
230a0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
230b0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
230c0 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65  x = i;.    pPage
230d0 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
230e0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
230f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23100 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
23110 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
23120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23130 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23140 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23150 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
23160 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
23170 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
23180 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
23190 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
231a0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
231b0 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
231c0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
231d0 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
231e0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
231f0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
23200 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
23210 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
23220 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
23230 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
23240 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
23250 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 64   - sz ){.      d
23260 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
23270 61 67 65 29 3b 0a 20 20 20 20 20 20 74 6f 70 20  age);.      top 
23280 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
23290 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
232a0 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a  assert( end + sz
232b0 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d   <= top );.    }
232c0 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63  .    idx = alloc
232d0 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
232e0 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  sz);.    assert(
232f0 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73   idx>0 );.    as
23300 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74  sert( end <= get
23310 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
23320 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  5]) );.    pPage
23330 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
23340 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
23350 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
23360 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
23370 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
23380 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Skip);.    for(j
23390 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74  =end-2, ptr=&dat
233a0 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
233b0 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
233c0 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
233d0 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
233e0 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
233f0 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
23400 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
23410 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
23420 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
23430 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70  e->nCell);.    p
23440 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
23450 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
23460 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
23470 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
23480 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
23490 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
234a0 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
234b0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
234c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
234d0 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
234e0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
234f0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
23500 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
23510 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
23520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c      */.      Cel
23530 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
23540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
23550 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
23560 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
23570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
23580 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
23590 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
235a0 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
235b0 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20  ayload );.      
235c0 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
235d0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
235e0 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
235f0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
23600 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
23610 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
23620 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
23630 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ow]);.        rc
23640 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61   = ptrmapPut(pPa
23650 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66  ge->pBt, pgnoOvf
23660 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
23670 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
23680 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23690 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
236a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
236b0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
236c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
236d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
236e0 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
236f0 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
23700 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
23710 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
23720 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
23730 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
23740 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
23750 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
23760 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
23770 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
23780 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
23790 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
237a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
237b0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
237c0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
237d0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
237e0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
237f0 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
23800 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
23810 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
23820 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
23830 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
23840 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
23850 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
23860 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
23870 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65  .  int totalSize
23880 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69  ;    /* Total si
23890 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
238a0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
238b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
238c0 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
238d0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b  /.  int cellptr;
238e0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
238f0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
23900 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
23910 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
23920 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
23930 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
23940 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
23950 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65   /* Data for the
23960 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
23970 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
23980 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
23990 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
239a0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
239b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
239c0 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
239d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
239e0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
239f0 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
23a00 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
23a10 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
23a20 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
23a30 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
23a40 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
23a50 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50  ;.  cellptr = pP
23a60 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
23a70 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
23a80 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
23a90 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
23aa0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
23ab0 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
23ac0 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29  );.  if( nCell )
23ad0 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d  {.    cellbody =
23ae0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
23af0 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29  Page, totalSize)
23b00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  ;.    assert( ce
23b10 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20  llbody>0 );.    
23b20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
23b30 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20  Free >= 2*nCell 
23b40 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
23b50 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a  ree -= 2*nCell;.
23b60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23b70 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
23b80 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
23b90 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62  [cellptr], cellb
23ba0 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ody);.      memc
23bb0 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
23bc0 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
23bd0 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Size[i]);.      
23be0 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  cellptr += 2;.  
23bf0 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20      cellbody += 
23c00 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a  aSize[i];.    }.
23c10 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
23c20 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74  body==pPage->pBt
23c30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
23c40 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
23c50 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  ll = nCell;.}../
23c60 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
23c70 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
23c80 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
23c90 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
23ca0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
23cb0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
23cc0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
23cd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
23ce0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
23cf0 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
23d00 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
23d10 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
23d20 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
23d30 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
23d40 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
23d50 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
23d60 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
23d70 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
23d80 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
23d90 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
23da0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
23db0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
23dc0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
23dd0 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
23de0 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
23df0 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
23e00 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
23e10 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
23e20 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
23e30 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
23e40 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
23e50 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
23e60 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
23e70 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
23e80 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
23e90 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
23ea0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
23eb0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
23ec0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ee0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
23ef0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
23f00 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
23f10 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
23f20 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
23f30 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
23f40 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
23f50 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
23f60 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
23f70 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65  c int balance(Me
23f80 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23  mPage*, int);..#
23f90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23fa0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
23fb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
23fc0 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
23fd0 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
23fe0 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
23ff0 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
24000 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
24010 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
24020 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
24030 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
24040 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
24050 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
24060 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
24070 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
24080 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
24090 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
240a0 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65  f trying balance
240b0 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
240c0 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
240d0 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
240e0 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
240f0 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
24100 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
24110 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
24120 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
24130 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
24140 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
24150 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
24160 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
24170 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
24180 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
24190 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
241a0 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
241b0 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
241c0 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
241d0 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
241e0 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
241f0 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
24200 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
24210 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
24220 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
24230 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
24240 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
24250 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
24260 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
24270 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
24280 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
24290 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
242a0 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
242b0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
242c0 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
242d0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
242e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
242f0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
24300 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
24310 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20   Pgno pgnoNew;. 
24320 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31   u8 *pCell;.  u1
24330 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c  6 szCell;.  Cell
24340 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53  Info info;.  BtS
24350 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
24360 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70  ge->pBt;.  int p
24370 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65  arentIdx = pPare
24380 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20  nt->nCell;   /* 
24390 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69  pParent new divi
243a0 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  der cell index *
243b0 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69  /.  int parentSi
243c0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
243d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
243e0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
243f0 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74  l */.  u8 parent
24400 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20  Cell[64];       
24410 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
24420 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69  e for the new di
24430 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20  vider cell */.. 
24440 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24450 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
24460 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
24470 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
24480 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73   a new page. Ins
24490 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ert the overflow
244a0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
244b0 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54  .  ** into it. T
244c0 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f  hen remove the o
244d0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f  verflow cell fro
244e0 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  m pPage..  */.  
244f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
24500 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
24510 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
24520 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
24530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
24540 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
24550 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
24560 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
24570 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
24580 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
24590 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ll);.  zeroPage(
245a0 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61  pNew, pPage->aDa
245b0 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62  ta[0]);.  assemb
245c0 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
245d0 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
245e0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
245f0 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  flow = 0;..  /* 
24600 53 65 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f  Set the parent o
24610 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  f the newly allo
24620 63 61 74 65 64 20 70 61 67 65 20 74 6f 20 70 50  cated page to pP
24630 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77  arent. */.  pNew
24640 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
24650 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ent;.  sqlite3Pa
24660 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e  gerRef(pParent->
24670 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20  pDbPage);..  /* 
24680 70 50 61 67 65 20 69 73 20 63 75 72 72 65 6e 74  pPage is current
24690 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  ly the right-chi
246a0 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43  ld of pParent. C
246b0 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20  hange this.  ** 
246c0 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
246d0 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
246e0 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
246f0 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a  d above and.  **
24700 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e 65   pPage is the ne
24710 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c  xt-to-right chil
24720 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 67  d. .  **.  ** Ig
24730 6e 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e 20  nore the return 
24740 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 61 6c  value of the cal
24750 6c 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  l to fillInCell(
24760 29 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a  ). fillInCell().
24770 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65    ** may only re
24780 74 75 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  turn other than 
24790 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20  SQLITE_OK if it 
247a0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  is required to a
247b0 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 6f 6e 65  llocate.  ** one
247c0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
247d0 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65 20 61  w pages. Since a
247e0 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65  n internal table
247f0 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a 20 20   B-Tree cell .  
24800 2a 2a 20 6d 61 79 20 6e 65 76 65 72 20 73 70 69  ** may never spi
24810 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f 20 61 6e 20  ll over onto an 
24820 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 28 69  overflow page (i
24830 74 20 69 73 20 61 20 6d 61 78 69 6d 75 6d 20 6f  t is a maximum o
24840 66 20 0a 20 20 2a 2a 20 31 33 20 62 79 74 65 73  f .  ** 13 bytes
24850 20 69 6e 20 73 69 7a 65 29 2c 20 69 74 20 69 73   in size), it is
24860 20 6e 6f 74 20 6e 65 63 63 65 73 73 61 72 79 20   not neccessary 
24870 74 6f 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  to check the ret
24880 75 72 6e 20 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20  urn code..  **. 
24890 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74   ** Similarly, t
248a0 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  he insertCell() 
248b0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
248c0 66 61 69 6c 20 69 66 20 74 68 65 20 70 61 67 65  fail if the page
248d0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65  .  ** being inse
248e0 72 74 65 64 20 69 6e 74 6f 20 69 73 20 61 6c 72  rted into is alr
248f0 65 61 64 79 20 77 72 69 74 61 62 6c 65 20 61 6e  eady writable an
24900 64 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  d the cell does 
24910 6e 6f 74 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  not .  ** contai
24920 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f  n an overflow po
24930 69 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65  inter. So ignore
24940 20 74 68 69 73 20 72 65 74 75 72 6e 20 63 6f 64   this return cod
24950 65 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 61 73  e too..  */.  as
24960 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
24970 6c 6c 3e 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20  ll>0 );.  pCell 
24980 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
24990 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
249a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
249b0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
249c0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
249d0 6f 29 3b 0a 20 20 66 69 6c 6c 49 6e 43 65 6c 6c  o);.  fillInCell
249e0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
249f0 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
24a00 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
24a10 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 61 73 73  rentSize);.  ass
24a20 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c  ert( parentSize<
24a30 36 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  64 );.  assert( 
24a40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
24a50 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
24a60 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
24a70 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
24a80 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61  t, parentIdx, pa
24a90 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74  rentCell, parent
24aa0 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 70  Size, 0, 4);.  p
24ab0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
24ac0 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
24ad0 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61  ,parentIdx), pPa
24ae0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74  ge->pgno);.  put
24af0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
24b00 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
24b10 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
24b20 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20  oNew);..#ifndef 
24b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24b40 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74  VACUUM.  /* If t
24b50 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
24b60 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
24b70 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
24b80 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68  er map.  ** with
24b90 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
24ba0 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
24bb0 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
24bc0 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f  the .  ** cell o
24bd0 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e  n the page to an
24be0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
24bf0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
24c00 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
24c10 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
24c20 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
24c30 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
24c40 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  rent->pgno);.   
24c50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24c60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
24c70 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
24c80 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  New, 0);.    }. 
24c90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
24cb0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
24cc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
24cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
24ce0 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  if..  /* Release
24cf0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
24d00 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61  o the new page a
24d10 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70  nd balance the p
24d20 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a  arent page,.  **
24d30 20 69 6e 20 63 61 73 65 20 74 68 65 20 64 69 76   in case the div
24d40 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74  ider cell insert
24d50 65 64 20 63 61 75 73 65 64 20 69 74 20 74 6f 20  ed caused it to 
24d60 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e  become overfull.
24d70 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50  .  */.  releaseP
24d80 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  age(pNew);.  ret
24d90 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61 72  urn balance(pPar
24da0 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69  ent, 0);.}.#endi
24db0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
24dc0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f  _QUICKBALANCE */
24dd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
24de0 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
24df0 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  es Cells on pPag
24e00 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32  e and up to NN*2
24e10 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20   siblings.** of 
24e20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c  pPage so that al
24e30 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
24e40 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75  ut the same amou
24e50 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
24e60 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20  ..** Usually NN 
24e70 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
24e80 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
24e90 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20   is used in the 
24ea0 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68  balancing,.** th
24eb0 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e  ough more siblin
24ec0 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
24ed0 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70  om one side if p
24ee0 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  Page is the firs
24ef0 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69  t.** or last chi
24f00 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74  ld of its parent
24f10 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73 20  .  If pPage has 
24f20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20  fewer than 2*NN 
24f30 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d  siblings.** (som
24f40 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e  ething which can
24f50 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
24f60 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f  pPage is the roo
24f70 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20  t page or a .** 
24f80 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74  child of root) t
24f90 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
24fa0 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69  e siblings parti
24fb0 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
24fc0 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
24fd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
24fe0 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d  lings of pPage m
24ff0 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
25000 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
25010 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20  y one or.** two 
25020 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
25030 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
25040 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
25050 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f  ver full. The ro
25060 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70  ot page.** is sp
25070 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c  ecial and is all
25080 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c  owed to be nearl
25090 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67  y empty. If pPag
250a0 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f  e is .** the roo
250b0 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
250c0 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
250d0 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ee might be incr
250e0 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72  eased.** or decr
250f0 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73  eased by one, as
25100 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b   necessary, to k
25110 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67  eep the root pag
25120 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  e from being.** 
25130 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70  overfull or comp
25140 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  letely empty..**
25150 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
25160 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
25170 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
25180 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20  of the Cells on 
25190 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e  pPage.** might n
251a0 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
251b0 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e  tored in pPage->
251c0 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63  aData[].  This c
251d0 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
251e0 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
251f0 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74  full.  Part of t
25200 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
25210 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20  outine is to.** 
25220 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65  make sure all Ce
25230 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e  lls for pPage on
25240 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20  ce again fit in 
25250 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a  pPage->aData[]..
25260 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
25270 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
25280 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66   the siblings of
25290 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65   pPage, the pare
252a0 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d  nt of pPage.** m
252b0 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72  ight become over
252c0 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
252d0 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70 70  l.  If that happ
252e0 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ens, then this r
252f0 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
25300 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
25310 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a  on the parent..*
25320 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
25330 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
25340 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
25350 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
25360 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
25370 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
25380 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
25390 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
253a0 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
253b0 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
253c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
253d0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
253e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
253f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
25400 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
25410 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66  /* The parent of
25420 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68   pPage */.  BtSh
25430 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
25440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25450 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
25460 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
25470 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
25480 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
25490 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
254a0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
254b0 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
254c0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
254d0 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
254e0 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
254f0 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25510 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
25520 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
25530 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
25560 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
25570 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20  .  int nDiv;    
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25590 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
255a0 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f  ls in apDiv[] */
255b0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255d0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
255e0 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20   */.  int idx;  
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70     /* Index of p
25610 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d  Page in pParent-
25620 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
25630 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
25640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
25650 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
25660 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
25670 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  l[] */.  int rc;
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
256a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
256b0 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t leafCorrection
256c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
256d0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
256e0 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
256f0 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
25720 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
25730 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
25740 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
25750 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
25760 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
25770 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
25780 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
25790 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
257a0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
257b0 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
257c0 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
257d0 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
257e0 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
257f0 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
25800 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
25810 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
25820 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
25830 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
25840 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
25850 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  ] */.  int iSpac
25860 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e2 = 0;         
25870 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
25880 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
25890 63 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ce2[] */.  int s
258a0 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
258b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
258c0 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
258d0 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
258e0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
258f0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
25900 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
25910 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
25920 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b  .  Pgno pgnoOld[
25930 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
25940 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20  /* Page numbers 
25950 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
25960 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65   apOld[] */.  Me
25970 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
25980 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
25990 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
259a0 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
259b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
259c0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
259d0 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
259e0 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
259f0 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
25a00 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
25a10 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
25a20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
25a30 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
25a40 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75  n apNew[] */.  u
25a50 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20  8 *apDiv[NB];   
25a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
25a70 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20  ivider cells in 
25a80 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  pParent */.  int
25a90 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   cntNew[NB+2];  
25aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
25ab0 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66  ex in aCell[] of
25ac0 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68   cell after i-th
25ad0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73   page */.  int s
25ae0 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  zNew[NB+2];     
25af0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69          /* Combi
25b00 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  ned size of cell
25b10 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20  s place on i-th 
25b20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
25b30 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  pCell = 0;      
25b40 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
25b50 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
25b60 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
25b70 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
25b80 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
25b90 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
25ba0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
25bb0 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20   u8 *aCopy[NB]; 
25bc0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
25bd0 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74   for holding dat
25be0 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f  a of apCopy[] */
25bf0 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20  .  u8 *aSpace1; 
25c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
25c10 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66  ce for copies of
25c20 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
25c30 62 65 66 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a  before balance *
25c40 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 32 20  /.  u8 *aSpace2 
25c50 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 70  = 0;       /* Sp
25c60 61 63 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77  ace for overflow
25c70 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
25c80 61 66 74 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f  after balance */
25c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25ca0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25cb0 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b    u8 *aFrom = 0;
25cc0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
25cd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
25ce0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
25cf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
25d00 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  * .  ** Find the
25d10 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
25d20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
25d30 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
25d40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
25d50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
25d60 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
25d70 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  || pPage->nOverf
25d80 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20  low==1 );.  pBt 
25d90 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
25da0 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
25db0 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65  >pParent;.  asse
25dc0 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20  rt( pParent );. 
25dd0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
25de0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
25df0 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d  erWrite(pParent-
25e00 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20  >pDbPage)) ){.  
25e10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
25e20 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
25e30 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20  NCE: begin page 
25e40 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e  %d child of %d\n
25e50 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
25e60 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b  pParent->pgno));
25e70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25e80 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
25e90 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73  CE.  /*.  ** A s
25ea0 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66  pecial case:  If
25eb0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73   a new entry has
25ec0 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72   just been inser
25ed0 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20  ted into a.  ** 
25ee0 74 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20  table (that is, 
25ef0 61 20 62 74 72 65 65 20 77 69 74 68 20 69 6e 74  a btree with int
25f00 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c  eger keys and al
25f10 6c 20 64 61 74 61 20 61 74 20 74 68 65 20 6c 65  l data at the le
25f20 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74  aves).  ** and t
25f30 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
25f40 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
25f50 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
25f60 20 28 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a   (it has the.  *
25f70 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74  * largest key) t
25f80 68 65 6e 20 75 73 65 20 74 68 65 20 73 70 65 63  hen use the spec
25f90 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  ial balance_quic
25fa0 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a  k() routine for.
25fb0 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20    ** balancing. 
25fc0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
25fd0 20 69 73 20 6d 75 63 68 20 66 61 73 74 65 72 20   is much faster 
25fe0 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61  and results in a
25ff0 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61   tighter.  ** pa
26000 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e  cking of data in
26010 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
26020 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
26030 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20  ge->leaf &&.    
26040 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
26050 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
26060 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a  nOverflow==1 &&.
26070 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76        pPage->aOv
26080 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
26090 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20  ->nCell &&.     
260a0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
260b0 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
260c0 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
260d0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
260e0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
260f0 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
26100 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
26110 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
26120 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
26130 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73  ODO: Check the s
26140 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c  iblings to the l
26150 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74  eft of pPage. It
26160 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20   may be that.   
26170 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74   ** they are not
26180 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77   full and no new
26190 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
261a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  d..    */.    re
261b0 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69  turn balance_qui
261c0 63 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ck(pPage, pParen
261d0 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  t);.  }.#endif..
261e0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
261f0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
26200 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
26210 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
26220 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
26230 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
26240 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  the cell in the 
26250 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73  parent page whos
26260 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69  e left child poi
26270 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f  nts back.  ** to
26280 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64   pPage.  The "id
26290 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74  x" variable is t
262a0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
262b0 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65   cell.  If pPage
262c0 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67  .  ** is the rig
262d0 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  htmost child of 
262e0 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74  pParent then set
262f0 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d   idx to pParent-
26300 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69  >nCell .  */.  i
26310 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  f( pParent->idxS
26320 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  hift ){.    Pgno
26330 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20   pgno;.    pgno 
26340 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  = pPage->pgno;. 
26350 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d     assert( pgno=
26360 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
26370 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
26380 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66  DbPage) );.    f
26390 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50  or(idx=0; idx<pP
263a0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64  arent->nCell; id
263b0 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  x++){.      if( 
263c0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
263d0 6c 28 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29  l(pParent, idx))
263e0 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ==pgno ){.      
263f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26400 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
26410 74 28 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e  t( idx<pParent->
26420 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  nCell.          
26430 20 20 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26     || get4byte(&
26440 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
26450 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
26460 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20  t+8])==pgno );. 
26470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20   }else{.    idx 
26480 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65  = pPage->idxPare
26490 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  nt;.  }..  /*.  
264a0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61  ** Initialize va
264b0 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20  riables so that 
264c0 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20  it will be safe 
264d0 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72  to jump.  ** dir
264e0 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65  ectly to balance
264f0 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20  _cleanup at any 
26500 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e  moment..  */.  n
26510 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a  Old = nNew = 0;.
26520 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
26530 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  f(pParent->pDbPa
26540 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ge);..  /*.  ** 
26550 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67  Find sibling pag
26560 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20  es to pPage and 
26570 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
26580 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65  rent that divide
26590 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e  .  ** the siblin
265a0 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20  gs.  An attempt 
265b0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
265c0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
265d0 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20  ither.  ** side 
265e0 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20  of pPage.  More 
265f0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
26600 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
26610 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20  , however, if.  
26620 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61  ** pPage there a
26630 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
26640 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
26650 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66   other side.  If
26660 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
26670 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
26680 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
26690 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
266a0 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20  ent are taken.. 
266b0 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64   */.  nxDiv = id
266c0 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78  x - NN;.  if( nx
266d0 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65  Div + NB > pPare
266e0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
266f0 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74   nxDiv = pParent
26700 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31  ->nCell - NB + 1
26710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
26720 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  v<0 ){.    nxDiv
26730 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76   = 0;.  }.  nDiv
26740 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 0;.  for(i=0,
26750 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20   k=nxDiv; i<NB; 
26760 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69  i++, k++){.    i
26770 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43  f( k<pParent->nC
26780 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44  ell ){.      apD
26790 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
267a0 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20  (pParent, k);.  
267b0 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20      nDiv++;.    
267c0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65    assert( !pPare
267d0 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  nt->leaf );.    
267e0 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
267f0 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
26800 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
26810 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65   k==pParent->nCe
26820 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  ll ){.      pgno
26830 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
26840 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
26850 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
26860 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
26870 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
26880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
26890 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
268a0 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c  pBt, pgnoOld[i],
268b0 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72   &apOld[i], pPar
268c0 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
268d0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
268e0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f  cleanup;.    apO
268f0 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74  ld[i]->idxParent
26900 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79   = k;.    apCopy
26910 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  [i] = 0;.    ass
26920 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a  ert( i==nOld );.
26930 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20      nOld++;.    
26940 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
26950 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
26960 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
26970 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ow;.  }..  /* Ma
26980 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d  ke nMaxCells a m
26990 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20  ultiple of 4 in 
269a0 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76  order to preserv
269b0 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c  e 8-byte.  ** al
269c0 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61  ignment */.  nMa
269d0 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65  xCells = (nMaxCe
269e0 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20  lls + 3)&~3;..  
269f0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
26a00 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
26a10 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a  y structures.  *
26a20 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a  /.  szScratch =.
26a30 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73         nMaxCells
26a40 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20  *sizeof(u8*)    
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a60 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a     /* apCell */.
26a70 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73       + nMaxCells
26a80 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20  *sizeof(u16)    
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26aa0 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a     /* szCell */.
26ab0 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73       + (ROUND8(s
26ac0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b  izeof(MemPage))+
26ad0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e  pBt->pageSize)*N
26ae0 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20  B  /* aCopy */. 
26af0 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53      + pBt->pageS
26b00 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a    /* aSpace1 */.
26b30 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41       + (ISAUTOVA
26b40 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73  CUUM ? nMaxCells
26b50 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20 20   : 0);          
26b60 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20     /* aFrom */. 
26b70 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
26b80 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20  3ScratchMalloc( 
26b90 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20  szScratch ); .  
26ba0 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
26bb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26bc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
26bd0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
26be0 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
26bf0 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e   (u16*)&apCell[n
26c00 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f  MaxCells];.  aCo
26c10 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a  py[0] = (u8*)&sz
26c20 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
26c30 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f  .  assert( ((aCo
26c40 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[0] - (u8*)apC
26c50 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
26c60 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
26c70 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
26c80 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b    for(i=1; i<NB;
26c90 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79   i++){.    aCopy
26ca0 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31  [i] = &aCopy[i-1
26cb0 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
26cc0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
26cd0 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73  mPage))];.    as
26ce0 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d  sert( ((aCopy[i]
26cf0 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
26d00 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
26d10 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
26d20 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20  equired */.  }. 
26d30 20 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70   aSpace1 = &aCop
26d40 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  y[NB-1][pBt->pag
26d50 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
26d60 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
26d70 20 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61    assert( ((aSpa
26d80 63 65 31 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  ce1 - (u8*)apCel
26d90 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
26da0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
26db0 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69  t required */.#i
26dc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26dd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
26de0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
26df0 75 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20  um ){.    aFrom 
26e00 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  = &aSpace1[pBt->
26e10 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23  pageSize];.  }.#
26e20 65 6e 64 69 66 0a 20 20 61 53 70 61 63 65 32 20  endif.  aSpace2 
26e30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
26e40 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  loc(pBt->pageSiz
26e50 65 29 3b 0a 20 20 69 66 28 20 61 53 70 61 63 65  e);.  if( aSpace
26e60 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  2==0 ){.    rc =
26e70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26e80 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
26e90 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a  cleanup;.  }.  .
26ea0 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63    /*.  ** Make c
26eb0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e  opies of the con
26ec0 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e  tent of pPage an
26ed0 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69  d its siblings i
26ee0 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a  nto aOld[]..  **
26ef0 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   The rest of thi
26f00 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
26f10 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  use data from th
26f20 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a  e copies rather.
26f30 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72    ** that the or
26f40 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e  iginal pages sin
26f50 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ce the original 
26f60 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e  pages will be in
26f70 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73   the.  ** proces
26f80 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
26f90 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ritten..  */.  f
26fa0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
26fb0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
26fc0 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d  e *p = apCopy[i]
26fd0 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f   = (MemPage*)aCo
26fe0 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  py[i];.    memcp
26ff0 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73  y(p, apOld[i], s
27000 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
27010 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20  .    p->aData = 
27020 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20  (void*)&p[1];.  
27030 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74    memcpy(p->aDat
27040 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61  a, apOld[i]->aDa
27050 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ta, pBt->pageSiz
27060 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  e);.  }..  /*.  
27070 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73  ** Load pointers
27080 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   to all cells on
27090 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
270a0 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63  nd the divider c
270b0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  ells.  ** into t
270c0 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b  he local apCell[
270d0 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63  ] array.  Make c
270e0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76  opies of the div
270f0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
27100 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
27110 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 31  ned form aSpace1
27120 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68  [] and remove th
27130 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65  e the divider Ce
27140 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
27150 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
27160 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
27170 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
27180 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
27190 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
271a0 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
271b0 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
271c0 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
271d0 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
271e0 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
271f0 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
27200 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
27210 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
27220 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
27230 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
27240 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
27250 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
27260 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
27270 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
27280 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
27290 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
272a0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
272b0 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
272c0 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
272d0 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
272e0 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
272f0 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
27300 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
27310 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
27320 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
27330 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
27340 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
27350 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
27360 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20  s..  */.  nCell 
27370 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65  = 0;.  leafCorre
27380 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c  ction = pPage->l
27390 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
273a0 61 20 3d 20 70 50 61 67 65 2d 3e 68 61 73 44 61  a = pPage->hasDa
273b0 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ta;.  for(i=0; i
273c0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
273d0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
273e0 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20   apCopy[i];.    
273f0 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64  int limit = pOld
27400 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
27410 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72  verflow;.    for
27420 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
27430 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
27440 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
27450 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65  ls );.      apCe
27460 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
27470 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
27480 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43  d, j);.      szC
27490 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
274a0 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
274b0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23  pCell[nCell]);.#
274c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
274d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
274e0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
274f0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
27500 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20     int a;.      
27510 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
27520 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
27530 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76  a=0; a<pOld->nOv
27540 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20  erflow; a++){.  
27550 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
27560 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c  ->aOvfl[a].pCell
27570 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  ==apCell[nCell] 
27580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
27590 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
275a0 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF;.            
275b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
275c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
275d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
275e0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
275f0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
27600 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73  1 ){.      u16 s
27610 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
27620 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
27630 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  ]);.      if( le
27640 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
27650 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45    /* With the LE
27660 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61  AFDATA flag, pPa
27670 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20  rent cells hold 
27680 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61  only INTKEYs tha
27690 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65  t.        ** are
276a0 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b   duplicates of k
276b0 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64  eys on the child
276c0 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64   pages.  We need
276d0 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20   to remove.     
276e0 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65     ** the divide
276f0 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61  r cells from pPa
27700 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69  rent, but the di
27710 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65  viders cells are
27720 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
27730 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b  added to apCell[
27740 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61  ] because they a
27750 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
27760 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20   child cells..  
27770 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27780 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
27790 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
277a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
277b0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
277c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
277d0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
277e0 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
277f0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
27800 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
27810 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b  Space1[iSpace1];
27820 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31  .        iSpace1
27830 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
27840 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
27850 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
27860 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
27870 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
27880 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
27890 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
278a0 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
278b0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
278c0 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
278d0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e  Correction;.#ifn
278e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
278f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
27900 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
27910 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
27920 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
27930 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20   = 0xFF;.       
27940 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
27950 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
27960 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
27970 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
27980 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72  Cell] -= leafCor
27990 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
279a0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
279b0 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c  e(pTemp)==pgnoOl
279c0 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  d[i] );.        
279d0 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
279e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
279f0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
27a00 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
27a10 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
27a20 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
27a30 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
27a40 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
27a50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
27a60 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
27a70 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
27a80 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
27a90 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
27aa0 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e  ld->aData[pOld->
27ab0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29  hdrOffset+8], 4)
27ac0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
27ad0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
27ae0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
27af0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
27b00 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
27b10 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
27b20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
27b30 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
27b40 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
27b50 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
27b60 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
27b70 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  ] = 4;.         
27b80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27b90 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
27ba0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
27bb0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
27bc0 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
27bd0 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
27be0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
27bf0 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
27c00 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
27c10 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
27c20 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
27c30 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
27c40 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
27c50 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
27c60 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
27c70 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
27c80 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
27c90 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
27ca0 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
27cb0 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
27cc0 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
27cd0 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
27ce0 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
27cf0 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
27d00 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
27d10 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
27d20 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
27d30 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
27d40 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
27d50 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
27d60 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
27d70 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
27d80 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
27d90 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
27da0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
27db0 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
27dc0 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
27dd0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
27de0 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
27df0 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
27e00 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
27e10 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
27e20 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
27e30 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
27e40 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
27e50 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
27e60 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
27e70 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
27e80 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
27e90 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
27ea0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
27eb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
27ec0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
27ed0 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
27ee0 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
27ef0 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
27f00 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
27f10 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
27f20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
27f30 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
27f40 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
27f50 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
27f60 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
27f70 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
27f80 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    k++;.    }.  }
27f90 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
27fa0 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
27fb0 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
27fc0 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
27fd0 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
27fe0 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
27ff0 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
28000 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
28010 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
28020 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
28030 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
28040 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
28050 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
28060 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
28070 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
28080 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
28090 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
280a0 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
280b0 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
280c0 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
280d0 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
280e0 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
280f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
28100 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
28110 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
28120 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
28130 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
28140 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
28150 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
28160 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
28170 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
28180 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
28190 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
281a0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
281b0 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
281c0 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
281d0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
281e0 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
281f0 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
28200 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
28210 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
28220 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
28230 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
28240 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
28250 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
28260 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
28270 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
28280 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
28290 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
282a0 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
282b0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
282c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
282d0 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
282e0 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
282f0 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
28300 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
28310 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
28320 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
28330 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
28340 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
28350 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
28360 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
28370 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
28380 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
28390 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
283a0 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
283b0 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
283c0 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
283d0 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
283e0 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
283f0 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
28400 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
28410 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
28420 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
28430 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
28440 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
28450 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
28460 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
28470 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
28480 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
28490 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
284a0 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
284b0 30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65  0) or we are the
284c0 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
284d0 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
284e0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
284f0 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
28500 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
28510 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
28520 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
28530 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
28540 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
28550 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
28560 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
28570 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
28580 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  ell==0) );..  /*
28590 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
285a0 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
285b0 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
285c0 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
285d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
285e0 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
285f0 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65  ageFlags = pPage
28600 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
28610 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
28620 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
28630 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
28640 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
28650 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
28660 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pOld[i];.      p
28670 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
28680 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
28690 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
286a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
286b0 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
286c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
286d0 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
286e0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
286f0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
28700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
28710 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
28720 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
28730 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
28740 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d  New, &pgnoNew[i]
28750 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20  , pgnoNew[i-1], 
28760 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
28770 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
28780 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
28790 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
287a0 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
287b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
287c0 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
287d0 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
287e0 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
287f0 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
28800 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
28810 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70  rc = freePage(ap
28820 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
28830 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
28840 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
28850 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
28860 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
28870 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
28880 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
28890 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
288a0 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
288b0 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
288c0 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
288d0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
288e0 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
288f0 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
28900 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
28910 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
28920 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
28930 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
28940 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
28950 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
28960 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
28970 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
28980 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
28990 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
289a0 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
289b0 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
289c0 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
289d0 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
289e0 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
289f0 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
28a00 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
28a10 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
28a20 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
28a30 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
28a40 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
28a50 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
28a60 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
28a70 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
28a80 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
28a90 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
28aa0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
28ab0 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
28ac0 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70      int minV = p
28ad0 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69  gnoNew[i];.    i
28ae0 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
28af0 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
28b00 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
28b10 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73   pgnoNew[j]<(uns
28b20 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20  igned)minV ){.  
28b30 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a        minI = j;.
28b40 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70          minV = p
28b50 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20  gnoNew[j];.     
28b60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
28b70 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
28b80 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65   int t;.      Me
28b90 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
28ba0 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b   t = pgnoNew[i];
28bb0 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
28bc0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  w[i];.      pgno
28bd0 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77  New[i] = pgnoNew
28be0 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70  [minI];.      ap
28bf0 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d  New[i] = apNew[m
28c00 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  inI];.      pgno
28c10 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20  New[minI] = t;. 
28c20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d       apNew[minI]
28c30 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pT;.    }.  }
28c40 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
28c50 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
28c60 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25  d  new: %d(%d) %
28c70 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
28c80 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
28c90 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a     pgnoOld[0], .
28ca0 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67      nOld>=2 ? pg
28cb0 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20  noOld[1] : 0,.  
28cc0 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f    nOld>=3 ? pgno
28cd0 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[2] : 0,.    
28ce0 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65  pgnoNew[0], szNe
28cf0 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
28d00 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a  2 ? pgnoNew[1] :
28d10 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a   0, nNew>=2 ? sz
28d20 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  New[1] : 0,.    
28d30 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65  nNew>=3 ? pgnoNe
28d40 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[2] : 0, nNew>=
28d50 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30  3 ? szNew[2] : 0
28d60 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20  ,.    nNew>=4 ? 
28d70 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20  pgnoNew[3] : 0, 
28d80 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
28d90 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
28da0 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d  >=5 ? pgnoNew[4]
28db0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
28dc0 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
28dd0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c  .  /*.  ** Evenl
28de0 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65  y distribute the
28df0 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b   data in apCell[
28e00 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77  ] across the new
28e10 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73   pages..  ** Ins
28e20 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ert divider cell
28e30 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61  s into pParent a
28e40 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
28e50 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  j = 0;.  for
28e60 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
28e70 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d  +){.    /* Assem
28e80 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c  ble the new sibl
28e90 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
28ea0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
28eb0 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61   apNew[i];.    a
28ec0 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
28ed0 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ls );.    assert
28ee0 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67  ( pNew->pgno==pg
28ef0 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20  noNew[i] );.    
28f00 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
28f10 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61  ageFlags);.    a
28f20 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
28f30 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
28f40 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
28f50 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
28f60 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
28f70 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
28f80 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
28f90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
28fa0 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
28fb0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
28fc0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
28fd0 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
28fe0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
28ff0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
29000 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
29010 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
29020 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
29030 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
29040 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
29050 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
29060 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
29070 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
29080 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
29090 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
290a0 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
290b0 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
290c0 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
290d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
290e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
290f0 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
29100 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
29110 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
29120 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
29130 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
29140 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
29150 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
29160 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
29170 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
29180 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
29190 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
291a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
291b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
291c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
291d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
291e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
291f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29200 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a   }.#endif..    j
29210 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
29220 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
29230 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
29240 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
29250 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
29260 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
29270 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
29280 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
29290 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
292a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e   */.    if( i<nN
292b0 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20  ew-1 && j<nCell 
292c0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
292d0 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
292e0 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
292f0 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
29300 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
29310 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
29320 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
29330 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
29340 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
29350 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
29360 61 53 70 61 63 65 32 5b 69 53 70 61 63 65 32 5d  aSpace2[iSpace2]
29370 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
29380 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
29390 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
293a0 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
293b0 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
293c0 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
293d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
293e0 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
293f0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
29400 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
29410 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
29420 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
29430 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
29440 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
29450 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
29460 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
29470 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
29480 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
29490 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
294a0 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
294b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
294c0 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
294d0 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
294e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
294f0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
29500 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
29510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29520 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
29530 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
29540 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
29550 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
29560 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e  ;.        fillIn
29570 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43  Cell(pParent, pC
29580 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
29590 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29  y, 0, 0, 0, &sz)
295a0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
295b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
295c0 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
295d0 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a  -= 4;.        /*
295e0 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f   Obscure case fo
295f0 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20  r non-leaf-data 
29600 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65  trees: If the ce
29610 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a  ll at pCell was.
29620 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
29630 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20  ously stored on 
29640 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64  a leaf node, and
29650 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69   its reported si
29660 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20  ze was 4.       
29670 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20   ** bytes, then 
29680 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  it may actually 
29690 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
296a0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  this .        **
296b0 20 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72   (see sqlite3Btr
296c0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
296d0 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
296e0 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
296f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
29700 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
29710 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
29720 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
29730 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
29740 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
29750 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
29760 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
29770 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
29780 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
29790 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
297a0 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
297b0 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20  a file, as all. 
297c0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20         ** cells 
297d0 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62  are at least 4 b
297e0 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61  ytes. It only ha
297f0 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73  ppens in b-trees
29800 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
29810 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e   to evaluate "IN
29820 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61   (SELECT ...)" a
29830 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73  nd similar claus
29840 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
29850 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
29860 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20  l[j]==4 ){.     
29870 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66       assert(leaf
29880 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a  Correction==4);.
29890 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63            sz = c
298a0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
298b0 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  nt, pCell);.    
298c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
298d0 20 20 20 20 69 53 70 61 63 65 32 20 2b 3d 20 73      iSpace2 += s
298e0 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
298f0 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69   sz<=pBt->pageSi
29900 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73  ze/4 );.      as
29910 73 65 72 74 28 20 69 53 70 61 63 65 32 3c 3d 70  sert( iSpace2<=p
29920 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
29930 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
29940 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
29950 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
29960 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20   pTemp, 4);.    
29970 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29980 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
29990 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
299a0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
299b0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
299c0 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77  ent,nxDiv), pNew
299d0 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
299e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
299f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
29a00 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
29a10 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
29a20 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c  ase, and not a l
29a30 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20  eaf-data tree,. 
29a40 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64       ** then upd
29a50 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
29a60 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72  map with an entr
29a70 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
29a80 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
29a90 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a   that the cell j
29aa0 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69  ust inserted poi
29ab0 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e  nts to (if any).
29ac0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
29ad0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
29ae0 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61  uum && !leafData
29af0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
29b00 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
29b10 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a  Parent, nxDiv);.
29b20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29b30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29b40 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
29b50 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
29b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
29b70 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b  endif.      j++;
29b80 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
29b90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
29ba0 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
29bb0 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
29bc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
29bd0 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
29be0 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
29bf0 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  EAF)==0 ){.    m
29c00 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
29c10 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
29c20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
29c30 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
29c40 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d   }.  if( nxDiv==
29c50 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
29c60 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
29c70 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
29c80 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
29c90 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
29ca0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
29cb0 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
29cc0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
29cd0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
29ce0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
29cf0 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
29d00 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
29d10 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
29d20 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
29d30 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
29d40 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
29d50 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
29d60 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
29d70 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
29d80 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
29d90 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
29da0 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
29db0 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
29dc0 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65    /*.  ** Repare
29dd0 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61  nt children of a
29de0 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  ll cells..  */. 
29df0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
29e00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
29e10 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
29e20 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  ges(apNew[i]);. 
29e30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29e40 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
29e50 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
29e60 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74  .  rc = reparent
29e70 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65  ChildPages(pPare
29e80 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
29e90 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
29ea0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
29eb0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
29ec0 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
29ed0 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
29ee0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
29ef0 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
29f00 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
29f10 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
29f20 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
29f30 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
29f40 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
29f50 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
29f60 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
29f70 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
29f80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
29f90 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
29fa0 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  .  sqlite3Scratc
29fb0 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  hFree(apCell);. 
29fc0 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 72   apCell = 0;.  r
29fd0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 72  c = balance(pPar
29fe0 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a  ent, 0);.  .  /*
29ff0 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
2a000 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2a010 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
2a020 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 50  anup:.  sqlite3P
2a030 61 67 65 46 72 65 65 28 61 53 70 61 63 65 32 29  ageFree(aSpace2)
2a040 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  ;.  sqlite3Scrat
2a050 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
2a060 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
2a070 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
2a080 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
2a090 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
2a0a0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
2a0b0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2a0c0 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
2a0d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2a0e0 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28  arent);.  TRACE(
2a0f0 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
2a100 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64  hed with %d: old
2a110 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
2a120 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2a130 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e    pPage->pgno, n
2a140 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
2a150 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
2a160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2a170 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2a180 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
2a190 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68  ge of a btree wh
2a1a0 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  en the root.** p
2a1b0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
2a1c0 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20  cells.  This is 
2a1d0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
2a1e0 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a  o make the tree.
2a1f0 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20  ** shallower by 
2a200 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  one level..*/.st
2a210 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2a220 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61  _shallower(MemPa
2a230 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
2a240 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
2a250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a260 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67  e only child pag
2a270 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  e of pPage */.  
2a280 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
2a290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a2a0 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
2a2b0 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  pChild */.  int 
2a2c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2a2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a2e0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
2a2f0 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
2a300 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
2a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a320 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65  /* The main BTre
2a330 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
2a340 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61   int mxCellPerPa
2a350 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
2a360 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2a370 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67  of cells per pag
2a380 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
2a390 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2a3a0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
2a3b0 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e   from pages bein
2a3c0 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
2a3d0 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a3f0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
2a400 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73  l cells */..  as
2a410 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
2a420 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
2a430 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2a440 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2a450 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a460 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2a470 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74  >mutex) );.  pBt
2a480 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2a490 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d   mxCellPerPage =
2a4a0 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20   MX_CELL(pBt);. 
2a4b0 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
2a4c0 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50  3Malloc( mxCellP
2a4d0 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
2a4e0 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29  8*)+sizeof(u16))
2a4f0 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
2a500 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2a510 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
2a520 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
2a530 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
2a540 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
2a550 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
2a560 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
2a570 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
2a580 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
2a590 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
2a5a0 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
2a5b0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
2a5c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
2a5d0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
2a5e0 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
2a5f0 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
2a600 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2a610 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
2a620 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
2a630 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
2a640 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
2a650 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
2a660 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
2a670 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
2a680 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2a690 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2a6a0 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
2a6b0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
2a6c0 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
2a6d0 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
2a6e0 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
2a6f0 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
2a700 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2a710 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
2a720 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
2a730 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
2a740 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
2a750 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
2a760 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
2a770 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
2a780 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
2a790 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
2a7a0 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
2a7b0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
2a7c0 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
2a7d0 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
2a7e0 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
2a7f0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
2a800 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
2a810 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
2a820 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
2a830 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
2a840 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
2a850 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
2a860 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
2a870 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2a880 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2a890 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
2a8a0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
2a8b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2a8c0 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72 50  gnoChild<=pagerP
2a8d0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e  agecount(pPage->
2a8e0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a  pBt->pPager) );.
2a8f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a900 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50 61  BtreeGetPage(pPa
2a910 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69  ge->pBt, pgnoChi
2a920 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b  ld, &pChild, 0);
2a930 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2a940 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
2a950 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20  alance;.    if( 
2a960 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pPage->pgno==1 )
2a970 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2a980 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2a990 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
2a9a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2a9b0 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2a9c0 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
2a9d0 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2a9e0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2a9f0 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c  .      if( pChil
2aa00 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b  d->nFree>=100 ){
2aa10 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2aa20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f  child informatio
2aa30 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  n will fit on th
2aa40 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20  e root page, so 
2aa50 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  do the.        *
2aa60 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20  * copy */.      
2aa70 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
2aa80 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2aa90 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
2aaa0 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ]);.        for(
2aab0 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
2aac0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2aad0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20        apCell[i] 
2aae0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c  = findCell(pChil
2aaf0 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d,i);.          
2ab00 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c  szCell[i] = cell
2ab10 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20  SizePtr(pChild, 
2ab20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  apCell[i]);.    
2ab30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2ab40 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65  semblePage(pPage
2ab50 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c  , pChild->nCell,
2ab60 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29   apCell, szCell)
2ab70 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;.        /* Cop
2ab80 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  y the right-poin
2ab90 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
2aba0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20   to the parent. 
2abb0 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  */.        put4b
2abc0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2abd0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2abe0 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20  et+8], .        
2abf0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43      get4byte(&pC
2ac00 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69  hild->aData[pChi
2ac10 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
2ac20 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  ));.        free
2ac30 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2ac40 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
2ac50 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
2ac60 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65  transfer to page
2ac70 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
2ac80 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gno));.      }el
2ac90 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2aca0 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72  he child has mor
2acb0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  e information th
2acc0 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  at will fit on t
2acd0 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20  he root..       
2ace0 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20   ** The tree is 
2acf0 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64  already balanced
2ad00 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  .  Do nothing. *
2ad10 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  /.        TRACE(
2ad20 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
2ad30 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74   %d will not fit
2ad40 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   on page 1\n", p
2ad50 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
2ad60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2ad70 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2ad80 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68  Page->aData, pCh
2ad90 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67  ild->aData, pPag
2ada0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2adb0 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
2adc0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2add0 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
2ade0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  nt = 0;.      rc
2adf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2ae00 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
2ae10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ae20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ae30 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65  ;.      freePage
2ae40 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2ae50 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2ae60 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20   transfer child 
2ae70 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c  %d into root %d\
2ae80 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2ae90 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20    pChild->pgno, 
2aea0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2aeb0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65     }.    rc = re
2aec0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
2aed0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73  (pPage);.    ass
2aee0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2aef0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e  rflow==0 );.#ifn
2af00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2af10 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2af20 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2af30 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  um ){.      int 
2af40 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
2af50 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
2af60 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20  ; i++){ .       
2af70 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
2af80 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  vfl(pPage, i);. 
2af90 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2afa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2afb0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
2afc0 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
2afd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2afe0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
2aff0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2b000 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f  Child);.  }.end_
2b010 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a  shallow_balance:
2b020 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2b030 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72  apCell);.  retur
2b040 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2b050 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
2b060 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20   overfull.**.** 
2b070 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e  When this happen
2b080 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  s, Create a new 
2b090 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63  child page and c
2b0a0 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  opy the.** conte
2b0b0 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  nts of the root 
2b0c0 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20  into the child. 
2b0d0 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72   Then make the r
2b0e0 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65  oot.** page an e
2b0f0 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72  mpty page with r
2b100 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69  ightChild pointi
2b110 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  ng to the new.**
2b120 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c   child.   Finall
2b130 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  y, call balance_
2b140 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68  internal() on th
2b150 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74  e new child.** t
2b160 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70  o cause it to sp
2b170 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lit..*/.static i
2b180 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
2b190 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
2b1a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
2b1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2b1c0 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
2b1d0 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
2b1e0 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
2b1f0 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
2b200 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
2b210 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
2b220 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20  noChild;     /* 
2b230 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
2b240 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
2b250 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
2b260 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pBt;         /*
2b270 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20   The BTree */.  
2b280 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
2b290 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61      /* Total usa
2b2a0 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  ble size of a pa
2b2b0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ge */.  u8 *data
2b2c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2b2d0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2b2e0 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75  rent page */.  u
2b2f0 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20  8 *cdata;       
2b300 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2b310 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
2b320 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
2b330 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2b340 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65  et to page heade
2b350 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20  r in parent */. 
2b360 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20   int brk;       
2b370 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2b380 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72  o content of fir
2b390 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e  st cell in paren
2b3a0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
2b3b0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
2b3c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b3d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2b3e0 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  0 );.  pBt = pPa
2b3f0 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ge->pBt;.  asser
2b400 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b410 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2b420 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  ) );.  rc = allo
2b430 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2b440 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e  t, &pChild, &pgn
2b450 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70  oChild, pPage->p
2b460 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  gno, 0);.  if( r
2b470 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b480 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2b490 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b4a0 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65  (pChild->pDbPage
2b4b0 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
2b4c0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
2b4d0 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ize;.  data = pP
2b4e0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
2b4f0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2b500 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65  fset;.  brk = ge
2b510 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b520 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20  +5]);.  cdata = 
2b530 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20  pChild->aData;. 
2b540 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26   memcpy(cdata, &
2b550 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65  data[hdr], pPage
2b560 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
2b570 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29  Page->nCell-hdr)
2b580 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74  ;.  memcpy(&cdat
2b590 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72  a[brk], &data[br
2b5a0 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62  k], usableSize-b
2b5b0 72 6b 29 3b 0a 20 20 69 66 28 20 70 43 68 69 6c  rk);.  if( pChil
2b5c0 64 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75  d->isInit ) retu
2b5d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2b5e0 54 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  T;.  rc = sqlite
2b5f0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2b600 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20  Child, pPage);. 
2b610 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2b620 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74  alancedeeper_out
2b630 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c  ;.  memcpy(pChil
2b640 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d  d->aOvfl, pPage-
2b650 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e  >aOvfl, pPage->n
2b660 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28  Overflow*sizeof(
2b670 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
2b680 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  );.  pChild->nOv
2b690 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e  erflow = pPage->
2b6a0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28  nOverflow;.  if(
2b6b0 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2b6c0 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c 64  ow ){.    pChild
2b6d0 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
2b6e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
2b6f0 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d  d->nCell==pPage-
2b700 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f  >nCell );.  zero
2b710 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2b720 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e  ld->aData[0] & ~
2b730 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74  PTF_LEAF);.  put
2b740 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2b750 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2b760 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69  fset+8], pgnoChi
2b770 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  ld);.  TRACE(("B
2b780 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f  ALANCE: copy roo
2b790 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c  t %d into %d\n",
2b7a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43   pPage->pgno, pC
2b7b0 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69  hild->pgno));.#i
2b7c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b7d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
2b7e0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2b7f0 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  um ){.    int i;
2b800 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
2b810 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d  Put(pBt, pChild-
2b820 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2b830 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  REE, pPage->pgno
2b840 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2b850 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70  goto balancedeep
2b860 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28  er_out;.    for(
2b870 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
2b880 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2b890 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2b8a0 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b  Ovfl(pChild, i);
2b8b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2b8c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b8d0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2b8e0 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20  deeper_out;.    
2b8f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
2b900 6e 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61  ndif.  rc = bala
2b910 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69  nce_nonroot(pChi
2b920 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65  ld);..balancedee
2b930 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61  per_out:.  relea
2b940 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
2b950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b960 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20  /*.** Decide if 
2b970 74 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e  the page pPage n
2b980 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
2b990 63 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69  ced.  If balanci
2b9a0 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65  ng is.** require
2b9b0 64 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72  d, call the appr
2b9c0 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
2b9d0 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  g routine..*/.st
2b9e0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2b9f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2ba00 20 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20   int insert){.  
2ba10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2ba20 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  OK;.  assert( sq
2ba30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ba40 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2ba50 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ex) );.  if( pPa
2ba60 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29  ge->pParent==0 )
2ba70 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2ba80 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2ba90 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2baa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bab0 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f  _OK && pPage->nO
2bac0 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
2bad0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2bae0 64 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20  deeper(pPage);. 
2baf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2bb00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2bb10 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
2bb20 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2bb30 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50  nce_shallower(pP
2bb40 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  age);.    }.  }e
2bb50 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
2bb60 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2bb70 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e  || .        (!in
2bb80 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e  sert && pPage->n
2bb90 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d  Free>pPage->pBt-
2bba0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
2bbb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2bbc0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2bbd0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
2bbe0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bbf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2bc00 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63  ine checks all c
2bc10 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e  ursors that poin
2bc20 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52  t to table pgnoR
2bc30 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  oot..** If any o
2bc40 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20  f those cursors 
2bc50 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68  were opened with
2bc60 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20   wrFlag==0 in a 
2bc70 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74  different.** dat
2bc80 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2bc90 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e   (a database con
2bca0 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61  nection that sha
2bcb0 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  res the pager.**
2bcc0 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20   cache with the 
2bcd0 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69  current connecti
2bce0 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68  on) and that oth
2bcf0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  er connection .*
2bd00 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  * is not in the 
2bd10 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64  ReadUncommmitted
2bd20 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69   state, then thi
2bd30 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2bd40 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  s .** SQLITE_LOC
2bd50 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65  KED..**.** As we
2bd60 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69  ll as cursors wi
2bd70 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75  th wrFlag==0, cu
2bd80 72 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61  rsors with wrFla
2bd90 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69 73 49  g==1 and .** isI
2bda0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31  ncrblobHandle==1
2bdb0 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64   are also consid
2bdc0 65 72 65 64 20 27 72 65 61 64 27 20 63 75 72 73  ered 'read' curs
2bdd0 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74 61 6c  ors. Incremental
2bde0 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73 6f 72   .** blob cursor
2bdf0 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 62  s are used for b
2be00 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20  oth reading and 
2be10 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57  writing..**.** W
2be20 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20  hen pgnoRoot is 
2be30 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2be40 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
2be50 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2be60 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f  is also.** respo
2be70 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c  nsible for inval
2be80 69 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e  idating incremen
2be90 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  tal blob cursors
2bea0 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   when the table 
2beb0 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20  row.** on which 
2bec0 74 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64 20  they are opened 
2bed0 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f  is deleted or mo
2bee0 64 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73 20  dified. Cursors 
2bef0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
2bf00 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
2bf10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75  the following ru
2bf20 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  les:.**.**   1) 
2bf30 57 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72 54  When BtreeClearT
2bf40 61 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64  able() is called
2bf50 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   to completely d
2bf60 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  elete the conten
2bf70 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20  ts.**      of a 
2bf80 42 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70 45  B-Tree table, pE
2bf90 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f  xclude is set to
2bfa0 20 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d 65   zero and parame
2bfb0 74 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20  ter iRow is .** 
2bfc0 20 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d       set to non-
2bfd0 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
2bfe0 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  se all increment
2bff0 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  al blob cursors 
2c000 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  open.**      on 
2c010 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
2c020 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65   at pgnoRoot are
2c030 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a   invalidated..**
2c040 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42 74  .**   2) When Bt
2c050 72 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74 72  reeInsert(), Btr
2c060 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
2c070 72 65 65 50 75 74 44 61 74 61 28 29 20 69 73 20  reePutData() is 
2c080 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20  called to .**   
2c090 20 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62 6c     modify a tabl
2c0a0 65 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51 4c  e row via an SQL
2c0b0 20 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78 63   statement, pExc
2c0c0 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  lude is set to t
2c0d0 68 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69 74  he .**      writ
2c0e0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
2c0f0 20 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63 61   do the modifica
2c100 74 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65 74  tion and paramet
2c110 65 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a 2a  er iRow is set.*
2c120 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e  *      to the in
2c130 74 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66 20  teger row id of 
2c140 74 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72 79  the B-Tree entry
2c150 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e   being modified.
2c160 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20   Unless.**      
2c170 70 45 78 63 6c 75 64 65 20 69 73 20 69 74 73 65  pExclude is itse
2c180 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  lf an incrementa
2c190 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74  l blob cursor, t
2c1a0 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e  hen all incremen
2c1b0 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62  tal.**      blob
2c1c0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2c1d0 20 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68 65   row iRow of the
2c1e0 20 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76 61   B-Tree are inva
2c1f0 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  lidated..**.**  
2c200 20 33 29 20 49 66 20 62 6f 74 68 20 70 45 78 63   3) If both pExc
2c210 6c 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61 72  lude and iRow ar
2c220 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e  e set to zero, n
2c230 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  o incremental bl
2c240 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 73  ob .**      curs
2c250 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
2c260 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
2c270 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  nt checkReadLock
2c280 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
2c290 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ee, .  Pgno pgno
2c2a0 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72 73 6f  Root, .  BtCurso
2c2b0 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20 20 69  r *pExclude,.  i
2c2c0 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42 74 43  64 iRow.){.  BtC
2c2d0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
2c2e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
2c2f0 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74  ee->pBt;.  sqlit
2c300 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d  e3 *db = pBtree-
2c310 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
2c320 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2c330 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b  Mutex(pBtree) );
2c340 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
2c350 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
2c360 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
2c370 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e  ==pExclude ) con
2c380 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2c390 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f  ->pgnoRoot!=pgno
2c3a0 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Root ) continue;
2c3b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c3c0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
2c3d0 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62    if( p->isIncrb
2c3e0 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a  lobHandle && ( .
2c3f0 20 20 20 20 20 20 20 20 20 28 21 70 45 78 63 6c           (!pExcl
2c400 75 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20  ude && iRow).   
2c410 20 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20     || (pExclude 
2c420 26 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73  && !pExclude->is
2c430 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
2c440 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  & p->info.nKey==
2c450 69 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20  iRow).    )){.  
2c460 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
2c470 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2c480 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2c490 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d   if( p->eState!=
2c4a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63  CURSOR_VALID ) c
2c4b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2c4c0 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23   p->wrFlag==0 .#
2c4d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c4e0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
2c4f0 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f   || p->isIncrblo
2c500 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20  bHandle.#endif. 
2c510 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
2c520 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70  te3 *dbOther = p
2c530 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
2c540 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d      if( dbOther=
2c550 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28  =0 ||.         (
2c560 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28  dbOther!=db && (
2c570 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26  dbOther->flags &
2c580 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2c590 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a  mmitted)==0) ){.
2c5a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2c5b0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
2c5c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c5d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c5e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  OK;.}../*.** Ins
2c5f0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
2c600 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
2c610 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
2c620 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
2c630 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
2c640 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
2c650 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
2c660 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
2c670 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
2c680 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
2c690 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
2c6a0 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
2c6b0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2c6c0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2c6d0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
2c6e0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
2c6f0 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
2c700 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
2c710 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
2c720 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
2c730 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
2c740 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
2c750 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
2c760 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
2c770 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a  oth ignored..*/.
2c780 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c790 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
2c7a0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2c7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2c7c0 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
2c7d0 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
2c7e0 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
2c7f0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
2c800 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
2c810 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
2c820 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
2c830 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
2c840 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
2c850 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
2c860 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
2c870 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c890 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
2c8a0 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
2c8b0 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
2c8c0 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20  nt appendBias   
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c8e0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c8f0 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
2c900 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
2c910 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69  ;.  int loc;.  i
2c920 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50  nt szNew;.  MemP
2c930 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
2c940 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
2c950 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
2c960 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2c970 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2c980 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
2c990 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
2c9a0 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ell = 0;..  asse
2c9b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2c9c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2c9d0 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2c9e0 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2c9f0 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2ca00 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2ca10 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f  action before do
2ca20 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f  ing an insert */
2ca30 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2ca40 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2ca50 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2ca60 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2ca70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2ca80 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2ca90 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21  dOnly );.  if( !
2caa0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a  pCur->wrFlag ){.
2cab0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cac0 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72  E_PERM;   /* Cur
2cad0 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72  sor not open for
2cae0 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
2caf0 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
2cb00 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65  ocks(pCur->pBtre
2cb10 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
2cb20 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 20 29  t, pCur, nKey) )
2cb30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2cb40 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
2cb50 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
2cb60 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
2cb70 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20  ad lock */.  }. 
2cb80 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2cb90 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
2cba0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
2cbb0 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20  ur->skip;.  }.. 
2cbc0 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
2cbd0 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
2cbe0 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
2cbf0 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a   on this table *
2cc00 2f 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50  /.  clearCursorP
2cc10 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2cc20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45   if( .    SQLITE
2cc30 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
2cc40 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2cc50 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2cc60 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c  Cur)) ||.    SQL
2cc70 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
2cc80 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2cc90 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 30 2c 20  (pCur, pKey, 0, 
2cca0 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73  nKey, appendBias
2ccb0 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20  , &loc)).  ){.  
2ccc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2ccd0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2cce0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2ccf0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2cd00 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
2cd10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2cd20 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
2cd30 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52 41 43  intKey );.  TRAC
2cd40 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c  E(("INSERT: tabl
2cd50 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e  e=%d nkey=%lld n
2cd60 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20  data=%d page=%d 
2cd70 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
2cd80 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2cd90 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50   nKey, nData, pP
2cda0 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  age->pgno,.     
2cdb0 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f       loc==0 ? "o
2cdc0 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77  verwrite" : "new
2cdd0 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73   entry"));.  ass
2cde0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2cdf0 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65  it );.  allocate
2ce00 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
2ce10 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d    newCell = pBt-
2ce20 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66  >pTmpSpace;.  if
2ce30 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72  ( newCell==0 ) r
2ce40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ce50 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  EM;.  rc = fillI
2ce60 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77  nCell(pPage, new
2ce70 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  Cell, pKey, nKey
2ce80 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
2ce90 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a  nZero, &szNew);.
2cea0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2ceb0 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73  end_insert;.  as
2cec0 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c  sert( szNew==cel
2ced0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2cee0 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  newCell) );.  as
2cef0 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f  sert( szNew<=MX_
2cf00 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
2cf10 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26  ;.  if( loc==0 &
2cf20 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  & CURSOR_VALID==
2cf30 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2cf40 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20      u16 szOld;. 
2cf50 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2cf60 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
2cf70 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
2cf80 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  l );.    rc = sq
2cf90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2cfa0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2cfb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2cfc0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
2cfd0 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sert;.    }.    
2cfe0 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65  oldCell = findCe
2cff0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2d000 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70  idx);.    if( !p
2d010 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2d020 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65      memcpy(newCe
2d030 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b  ll, oldCell, 4);
2d040 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64  .    }.    szOld
2d050 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2d060 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
2d070 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
2d080 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  ll(pPage, oldCel
2d090 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2d0a0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2d0b0 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70  ;.    dropCell(p
2d0c0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2d0d0 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65   szOld);.  }else
2d0e0 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
2d0f0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
2d100 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d110 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70  e->leaf );.    p
2d120 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20  Cur->idx++;.    
2d130 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2d140 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
2d150 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
2d160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2d170 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2d180 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e  );.  }.  rc = in
2d190 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20  sertCell(pPage, 
2d1a0 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65  pCur->idx, newCe
2d1b0 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29  ll, szNew, 0, 0)
2d1c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2d1d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
2d1e0 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20  _insert;.  rc = 
2d1f0 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31  balance(pPage, 1
2d200 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2d210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
2d220 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2d230 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a    }.end_insert:.
2d240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d250 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2d260 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2d270 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2d280 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
2d290 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
2d2a0 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
2d2b0 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  om location..*/.
2d2c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2d2d0 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
2d2e0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2d2f0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2d300 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e  >pPage;.  unsign
2d310 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2d320 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
2d330 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a   pgnoChild = 0;.
2d340 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
2d350 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
2d360 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2d370 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2d380 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2d390 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2d3a0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2d3b0 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  t );.  if( pBt->
2d3c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2d3d0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2d3e0 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2d3f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
2d400 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c  fore doing a del
2d410 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ete */.    rc = 
2d420 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2d430 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2d440 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2d450 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d460 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2d470 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
2d480 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2d490 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
2d4a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
2d4b0 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20  ur->skip;.  }.  
2d4c0 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2d4d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2d4e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d4f0 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2d500 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2d510 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2d520 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2d530 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2d540 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d550 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2d560 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2d570 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2d580 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2d590 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2d5a0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2d5b0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2d5c0 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  Cur, pCur->info.
2d5d0 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74  nKey) ){.    ret
2d5e0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2d5f0 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
2d600 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
2d610 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
2d620 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  /.  }..  /* Rest
2d630 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2d640 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
2d650 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20  (a no-op if the 
2d660 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  cursor is not in
2d670 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45   .  ** CURSOR_RE
2d680 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29  QUIRESEEK state)
2d690 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f   and save the po
2d6a0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
2d6b0 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20  ther cursors .  
2d6c0 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  ** open on the s
2d6d0 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20  ame table. Then 
2d6e0 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
2d6f0 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20  rWrite() on the 
2d700 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  page.  ** that t
2d710 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  he entry will be
2d720 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20   deleted from.. 
2d730 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
2d740 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2d750 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2d760 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
2d770 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
2d780 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
2d790 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20  Root, pCur))!=0 
2d7a0 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c  ||.    (rc = sql
2d7b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2d7c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2d7d0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2d7e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2d7f0 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   Locate the cell
2d800 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65   within its page
2d810 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c   and leave pCell
2d820 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2d830 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20  .  ** data. The 
2d840 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c  clearCell() call
2d850 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66   frees any overf
2d860 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2d870 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
2d880 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c  ** cell. The cel
2d890 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c  l itself is stil
2d8a0 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20  l intact..  */. 
2d8b0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2d8c0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2d8d0 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  dx);.  if( !pPag
2d8e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
2d8f0 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
2d900 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  yte(pCell);.  }.
2d910 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2d920 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2d930 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2d950 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2d960 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
2d970 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
2d980 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
2d990 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
2d9a0 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
2d9b0 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
2d9c0 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
2d9d0 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
2d9e0 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
2d9f0 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
2da00 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
2da10 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
2da20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
2da30 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
2da40 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
2da50 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
2da60 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
2da70 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
2da80 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
2da90 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
2daa0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
2dab0 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
2dac0 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2dad0 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
2dae0 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
2daf0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2db00 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  tempCell = 0;.  
2db10 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2db20 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
2db30 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
2db40 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
2db50 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72  &leafCur);.    r
2db60 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2db70 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
2db80 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
2db90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dba0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2dbb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2dbc0 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70  leafCur.pPage->p
2dbd0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
2dbe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2dbf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 31  E_OK ){.      u1
2dc00 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20  6 szNext;.      
2dc10 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2dc20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2dc30 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64  internal from %d
2dc40 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65   replace from le
2dc50 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  af %d\n",.      
2dc60 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2dc70 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  t, pPage->pgno, 
2dc80 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70  leafCur.pPage->p
2dc90 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f  gno));.      dro
2dca0 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
2dcb0 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65  r->idx, cellSize
2dcc0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2dcd0 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  ));.      pNext 
2dce0 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43  = findCell(leafC
2dcf0 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75  ur.pPage, leafCu
2dd00 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a  r.idx);.      sz
2dd10 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Next = cellSizeP
2dd20 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  tr(leafCur.pPage
2dd30 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  , pNext);.      
2dd40 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f  assert( MX_CELL_
2dd50 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78  SIZE(pBt)>=szNex
2dd60 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  t+4 );.      all
2dd70 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
2dd80 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43  Bt);.      tempC
2dd90 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
2dda0 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20  pace;.      if( 
2ddb0 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  tempCell==0 ){. 
2ddc0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2ddd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2dde0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
2ddf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2de00 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
2de10 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2de20 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20  ->idx, pNext-4, 
2de30 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65  szNext+4, tempCe
2de40 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
2de50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2de60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2de70 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
2de80 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
2de90 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c 20  ge, pCur->idx), 
2dea0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20  pgnoChild);.    
2deb0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2dec0 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
2ded0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2dee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2def0 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
2df00 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c  leafCur.pPage, l
2df10 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65  eafCur.idx, szNe
2df20 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  xt);.        rc 
2df30 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43 75  = balance(leafCu
2df40 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  r.pPage, 0);.   
2df50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2df60 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
2df70 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65  seTempCursor(&le
2df80 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  afCur);.  }else{
2df90 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c  .    TRACE(("DEL
2dfa0 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65  ETE: table=%d de
2dfb0 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lete from leaf %
2dfc0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75  d\n",.       pCu
2dfd0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
2dfe0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
2dff0 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
2e000 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53  pCur->idx, cellS
2e010 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2e020 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell));.    rc = 
2e030 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30  balance(pPage, 0
2e040 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2e050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e060 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
2e070 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
2e080 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
2e090 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
2e0a0 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
2e0b0 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
2e0c0 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
2e0d0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
2e0e0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
2e0f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
2e100 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
2e110 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
2e120 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
2e130 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
2e140 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
2e150 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72  f flags are curr
2e160 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f  ently in use.  O
2e170 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a  ther values for.
2e180 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e  ** flags might n
2e190 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20  ot work:.**.**  
2e1a0 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c     BTREE_INTKEY|
2e1b0 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20  BTREE_LEAFDATA  
2e1c0 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
2e1d0 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69  tables with rowi
2e1e0 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54  d keys.**     BT
2e1f0 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20  REE_ZERODATA    
2e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
2e210 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63  ed for SQL indic
2e220 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
2e230 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
2e240 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2e250 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
2e260 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ags){.  BtShared
2e270 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2e280 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
2e290 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
2e2a0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
2e2b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2e2c0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2e2d0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
2e2e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2e2f0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2e300 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2e310 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  a transaction fi
2e320 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  rst */.    rc = 
2e330 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2e340 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2e350 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2e360 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e370 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2e380 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
2e390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2e3a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2e3b0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2e3c0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
2e3d0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
2e3e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2e3f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2e400 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
2e410 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2e420 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
2e430 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
2e440 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
2e450 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
2e460 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
2e470 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
2e480 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
2e490 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
2e4a0 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65  . */..    /* Cre
2e4b0 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
2e4c0 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72  e may probably r
2e4d0 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
2e4e0 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
2e4f0 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  se.    ** to mak
2e500 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
2e510 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70  ew tables root p
2e520 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69  age. In case thi
2e530 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20  s page turns.   
2e540 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e   ** out to be an
2e550 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
2e560 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66  delete all overf
2e570 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63  low page-map cac
2e580 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20  hes.    ** held 
2e590 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  by open cursors.
2e5a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61  .    */.    inva
2e5b0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
2e5c0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20  wCache(pBt);..  
2e5d0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61    /* Read the va
2e5e0 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66  lue of meta[3] f
2e5f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2e600 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2e610 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ere the.    ** r
2e620 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2e630 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  new table should
2e640 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20   go. meta[3] is 
2e650 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
2e660 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65  -page.    ** cre
2e670 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20  ated so far, so 
2e680 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
2e690 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29  e is (meta[3]+1)
2e6a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2e6b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2e6c0 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e  tMeta(p, 4, &pgn
2e6d0 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
2e6e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e6f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f  ;.    }.    pgno
2e710 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  Root++;..    /* 
2e720 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  The new root-pag
2e730 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c  e may not be all
2e740 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e  ocated on a poin
2e750 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72  ter-map page, or
2e760 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44   the.    ** PEND
2e770 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20  ING_BYTE page.. 
2e780 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
2e790 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41   pgnoRoot==PTRMA
2e7a0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67  P_PAGENO(pBt, pg
2e7b0 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20  noRoot) ||.     
2e7c0 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e     pgnoRoot==PEN
2e7d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2e7e0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  Bt) ){.      pgn
2e7f0 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  oRoot++;.    }. 
2e800 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52     assert( pgnoR
2e810 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f  oot>=3 );..    /
2e820 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67  * Allocate a pag
2e830 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61 74  e. The page that
2e840 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64   currently resid
2e850 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77  es at pgnoRoot w
2e860 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f  ill.    ** be mo
2e870 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ved to the alloc
2e880 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73  ated page (unles
2e890 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  s the allocated 
2e8a0 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20  page happens.   
2e8b0 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74   ** to reside at
2e8c0 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20   pgnoRoot)..    
2e8d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  */.    rc = allo
2e8e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2e8f0 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26  t, &pPageMove, &
2e900 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f  pgnoMove, pgnoRo
2e910 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ot, 1);.    if( 
2e920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e930 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e940 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2e950 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52   pgnoMove!=pgnoR
2e960 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oot ){.      /* 
2e970 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20  pgnoRoot is the 
2e980 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62  page that will b
2e990 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
2e9a0 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20  oot-page of.    
2e9b0 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62    ** the new tab
2e9c0 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20  le (assuming an 
2e9d0 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63  error did not oc
2e9e0 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65 72  cur). But we wer
2e9f0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63  e.      ** alloc
2ea00 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49  ated pgnoMove. I
2ea10 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e  f required (i.e.
2ea20 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61   if it was not a
2ea30 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a  llocated.      *
2ea40 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74  * by extending t
2ea50 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75  he file), the cu
2ea60 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f  rrent page at po
2ea70 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a  sition pgnoMove.
2ea80 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65        ** is alre
2ea90 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20  ady journaled.. 
2eaa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38       */.      u8
2eab0 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67   eType;.      Pg
2eac0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
2ead0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2eae0 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20  pPageMove);..   
2eaf0 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70     /* Move the p
2eb00 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74  age currently at
2eb10 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e   pgnoRoot to pgn
2eb20 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20  oMove. */.      
2eb30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2eb40 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
2eb50 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
2eb60 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2eb70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2eb80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2eb90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2eba0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
2ebb0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65  Bt, pgnoRoot, &e
2ebc0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
2ebd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2ebe0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79  SQLITE_OK || eTy
2ebf0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
2ec00 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  AGE || eType==PT
2ec10 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
2ec20 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ec30 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2ec40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ec50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2ec60 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
2ec70 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
2ec80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
2ec90 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype!=PTRMAP_FREE
2eca0 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63  PAGE );.      rc
2ecb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ecc0 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
2ecd0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2ece0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ecf0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ed00 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2ed10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ed20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2ed30 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
2ed40 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70  pBt, pRoot, eTyp
2ed50 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e  e, iPtrPage, pgn
2ed60 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  oMove, 0);.     
2ed70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2ed80 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ot);..      /* O
2ed90 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61  btain the page a
2eda0 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20  t pgnoRoot */.  
2edb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2edc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2edd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ede0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
2edf0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2ee00 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
2ee10 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
2ee20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ee30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ee40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ee50 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
2ee60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ee70 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2ee80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2ee90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2eea0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2eeb0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
2eec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2eed0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2eee0 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61       pRoot = pPa
2eef0 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a  geMove;.    } ..
2ef00 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2ef10 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e  e pointer-map an
2ef20 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68  d meta-data with
2ef30 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
2ef40 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  ge number. */.  
2ef50 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2ef60 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2ef70 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
2ef80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
2ef90 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2efa0 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2efb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2efc0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
2efd0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
2efe0 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f  eta(p, 4, pgnoRo
2eff0 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ot);.    if( rc 
2f000 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2f010 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2f020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f030 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
2f040 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2f050 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2f060 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
2f070 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
2f080 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f090 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73    }.#endif.  ass
2f0a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2f0b0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
2f0c0 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
2f0d0 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
2f0e0 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45  , flags | PTF_LE
2f0f0 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  AF);.  sqlite3Pa
2f100 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e  gerUnref(pRoot->
2f110 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54  pDbPage);.  *piT
2f120 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f  able = (int)pgno
2f130 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  Root;.  return S
2f140 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
2f150 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
2f160 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
2f170 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
2f180 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
2f190 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
2f1a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
2f1b0 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  p->pBt->db = p->
2f1c0 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  db;.  rc = btree
2f1d0 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70  CreateTable(p, p
2f1e0 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a  iTable, flags);.
2f1f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2f200 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
2f210 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
2f220 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61  ase the given da
2f230 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20  tabase page and 
2f240 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e  all its children
2f250 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
2f260 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
2f270 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
2f280 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61   int clearDataba
2f290 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  sePage(.  BtShar
2f2a0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
2f2b0 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
2f2c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2f2d0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e  e table */.  Pgn
2f2e0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
2f2f0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2f300 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20  r to clear */.  
2f310 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2f320 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
2f330 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20  page.  NULL for 
2f340 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e  the root */.  in
2f350 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20  t freePageFlag  
2f360 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
2f370 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a  e page if true *
2f380 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
2f390 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
2f3a0 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
2f3b0 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69  char *pCell;.  i
2f3c0 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
2f3d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2f3e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2f3f0 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61  );.  if( pgno>pa
2f400 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
2f410 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
2f420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2f430 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
2f440 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
2f450 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
2f460 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65  o, &pPage, pPare
2f470 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
2f480 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2f490 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
2f4a0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
2f4b0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2f4c0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2f4d0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
2f4e0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2f4f0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2f500 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2f510 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2f520 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70  pCell), pPage->p
2f530 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
2f540 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2f550 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2f560 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2f570 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2f580 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2f590 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2f5a0 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2f5b0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
2f5c0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2f5d0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
2f5e0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2f5f0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2f600 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50  e->aData[8]), pP
2f610 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2f620 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2f630 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2f640 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2f650 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61   if( freePageFla
2f660 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  g ){.    rc = fr
2f670 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2f680 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
2f690 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f6a0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2f6b0 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65  e))==0 ){.    ze
2f6c0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  roPage(pPage, pP
2f6d0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20  age->aData[0] | 
2f6e0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a  PTF_LEAF);.  }..
2f6f0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2f700 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  e_out:.  release
2f710 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
2f720 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f730 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  ** Delete all in
2f740 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
2f750 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
2f760 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2f770 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65  iTable is.** the
2f780 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2f790 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2f7a0 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68  table.  After th
2f7b0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2f7c0 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  ns,.** the root 
2f7d0 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62  page is empty, b
2f7e0 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e  ut still exists.
2f7f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2f800 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
2f810 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
2f820 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2f830 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63  y open.** read c
2f840 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
2f850 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65  ble.  Open write
2f860 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76   cursors are mov
2f870 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f  ed to the.** roo
2f880 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
2f890 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2f8a0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
2f8b0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
2f8c0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
2f8d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2f8e0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
2f8f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
2f900 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
2f910 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  db;.  if( p->inT
2f920 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
2f930 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42  E ){.    rc = pB
2f940 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2f950 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2f960 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2f970 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
2f980 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2f990 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29  , iTable, 0, 1))
2f9a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f9b0 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
2f9c0 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69   do */.  }else i
2f9d0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
2f9e0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2f9f0 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20  rs(pBt, iTable, 
2fa00 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  0)) ){.    /* no
2fa10 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
2fa20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2fa30 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2fa40 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2fa50 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  able, 0, 0);.  }
2fa60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
2fa70 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
2fa80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
2fa90 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  rase all informa
2faa0 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20  tion in a table 
2fab0 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74  and add the root
2fac0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
2fad0 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74  .** the freelist
2fae0 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72  .  Except, the r
2faf0 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63  oot of the princ
2fb00 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20  iple table (the 
2fb10 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31  one on.** page 1
2fb20 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64  ) is never added
2fb30 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2fb40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2fb50 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
2fb60 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
2fb70 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
2fb80 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f  ny open.** curso
2fb90 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
2fba0 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41  .**.** If AUTOVA
2fbb0 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20  CUUM is enabled 
2fbc0 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20  and the page at 
2fbd0 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68  iTable is not th
2fbe0 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70  e last.** root p
2fbf0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2fc00 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
2fc10 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2fc20 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  e .** in the dat
2fc30 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f  abase file is mo
2fc40 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f  ved into the slo
2fc50 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70  t formerly occup
2fc60 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65  ied by.** iTable
2fc70 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73   and that last s
2fc80 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63  lot formerly occ
2fc90 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73  upied by the las
2fca0 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  t root page.** i
2fcb0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
2fcc0 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20  reelist instead 
2fcd0 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74  of iTable.  In t
2fce0 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20  his say, all.** 
2fcf0 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b  root pages are k
2fd00 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e  ept at the begin
2fd10 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
2fd20 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
2fd30 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79  .** is necessary
2fd40 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20   for AUTOVACUUM 
2fd50 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20  to work right.  
2fd60 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20  *piMoved is set 
2fd70 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  to the .** page 
2fd80 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64  number that used
2fd90 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20   to be the last 
2fda0 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
2fdb0 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20   file before.** 
2fdc0 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f  the move.  If no
2fdd0 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64   page gets moved
2fde0 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65  , *piMoved is se
2fdf0 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c  t to 0..** The l
2fe00 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ast root page is
2fe10 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74   recorded in met
2fe20 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c  a[3] and the val
2fe30 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d  ue of.** meta[3]
2fe40 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74   is updated by t
2fe50 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a  his procedure..*
2fe60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
2fe70 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65  eeDropTable(Btre
2fe80 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2fe90 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
2fea0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
2feb0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2fec0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2fed0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
2fee0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
2fef0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
2ff00 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  );.  if( p->inTr
2ff10 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2ff20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2ff30 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2ff40 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2ff50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2ff60 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69   }..  /* It is i
2ff70 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61  llegal to drop a
2ff80 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2ff90 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2ffa0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2ffb0 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2ffc0 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2ffd0 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2ffe0 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2fff0 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68  ed to move anoth
30000 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  er root-page to 
30010 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20  fill a gap left 
30020 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20  by the deleted. 
30030 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49   ** root page. I
30040 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
30050 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20   was using this 
30060 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
30070 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72  ould .  ** occur
30080 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
30090 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
300a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
300b0 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63  OCKED;.  }..  rc
300c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
300d0 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
300e0 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65  o)iTable, &pPage
300f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
30100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
30110 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
30120 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61  learTable(p, iTa
30130 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ble);.  if( rc )
30140 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
30150 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
30160 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
30170 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20  *piMoved = 0;.. 
30180 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b   if( iTable>1 ){
30190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
301a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
301b0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
301c0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c  (pPage);.    rel
301d0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
301e0 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
301f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
30200 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78  {.      Pgno max
30210 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
30220 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
30230 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
30240 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
30250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30270 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
30280 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ge);.        ret
30290 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
302a0 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c  .      if( iTabl
302b0 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29  e==maxRootPgno )
302c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
302d0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
302e0 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74  dropped is the t
302f0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61  able with the la
30300 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
30310 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
30320 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
30330 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20  e, put the root 
30340 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
30350 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20   list. .        
30360 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
30370 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
30380 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
30390 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
303a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
303b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
303c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
303d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
303e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
303f0 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
30400 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f   dropped does no
30410 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65  t have the large
30420 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
30430 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
30440 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
30450 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  So move the page
30460 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20   that does into 
30470 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
30480 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
30490 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67  deleted root-pag
304a0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
304b0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
304c0 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65  Move;.        re
304d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
304e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
304f0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
30500 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
30510 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
30520 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30540 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30550 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
30560 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
30570 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76  tePage(pBt, pMov
30580 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e, PTRMAP_ROOTPA
30590 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30  GE, 0, iTable, 0
305a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
305b0 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
305c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
305d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
305e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
305f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30600 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
30610 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
30620 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
30630 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
30640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30660 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
30680 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76   = freePage(pMov
30690 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
306a0 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
306b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
306c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
306d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
306e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
306f0 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d      *piMoved = m
30700 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
30710 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
30720 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72  t the new 'max-r
30730 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20  oot-page' value 
30740 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
30750 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20  header. This.   
30760 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64     ** is the old
30770 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c   value less one,
30780 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69   less one more i
30790 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74  f that happens t
307a0 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20  o.      ** be a 
307b0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
307c0 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e  , less one again
307d0 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a   if that is the.
307e0 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47        ** PENDING
307f0 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20  _BYTE_PAGE..    
30800 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f    */.      maxRo
30810 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
30820 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
30830 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
30840 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
30850 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
30860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30870 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
30880 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
30890 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  Bt, maxRootPgno)
308a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
308b0 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
308c0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
308d0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45   maxRootPgno!=PE
308e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
308f0 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72  pBt) );..      r
30900 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
30910 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
30920 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20   maxRootPgno);. 
30930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30940 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
30950 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  age);.      rele
30960 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
30970 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
30980 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
30990 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
309a0 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64  Table was called
309b0 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
309c0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
309d0 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  e, PTF_INTKEY|PT
309e0 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65  F_LEAF );.    re
309f0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
30a00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
30a10 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  c;  .}.int sqlit
30a20 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
30a30 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
30a40 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
30a50 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
30a60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
30a70 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
30a80 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
30a90 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61  rc = btreeDropTa
30aa0 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ble(p, iTable, p
30ab0 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74  iMoved);.  sqlit
30ac0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
30ad0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30ae0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
30af0 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
30b00 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62  n out of a datab
30b10 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b  ase file.  Meta[
30b20 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d  0].** is the num
30b30 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65  ber of free page
30b40 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
30b50 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
30b60 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68  ta[1].** through
30b70 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76   meta[15] are av
30b80 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
30b90 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73  by higher layers
30ba0 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
30bb0 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20   read-only, the 
30bc0 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f  others are read/
30bd0 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  write..** .** Th
30be0 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e  e schema layer n
30bf0 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75  umbers meta valu
30c00 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20  es differently. 
30c10 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a   At the schema.*
30c20 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65  * layer (and the
30c30 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52   SetCookie and R
30c40 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65  eadCookie opcode
30c50 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  s) the number of
30c60 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69  .** free pages i
30c70 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20  s not visible.  
30c80 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20  So Cookie[0] is 
30c90 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61  the same as Meta
30ca0 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  [1]..*/.int sqli
30cb0 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
30cc0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
30cd0 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a  x, u32 *pMeta){.
30ce0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
30cf0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  e;.  int rc;.  u
30d00 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
30d10 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  1;.  BtShared *p
30d20 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
30d30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
30d40 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
30d50 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52  = p->db;..  /* R
30d60 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61  eading a meta-da
30d70 74 61 20 76 61 6c 75 65 20 72 65 71 75 69 72 65  ta value require
30d80 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
30d90 20 70 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e   page 1 (and hen
30da0 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  ce.  ** the sqli
30db0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
30dc0 20 57 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f   We grab this lo
30dd0 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ck regardless of
30de0 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a   whether or.  **
30df0 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f   not the SQLITE_
30e00 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
30e10 66 6c 61 67 20 69 73 20 73 65 74 20 28 74 68 65  flag is set (the
30e20 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
30e30 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20   page.  ** 1 is 
30e40 74 72 65 61 74 65 64 20 61 73 20 61 20 73 70 65  treated as a spe
30e50 63 69 61 6c 20 63 61 73 65 20 62 79 20 71 75 65  cial case by que
30e60 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e  ryTableLock() an
30e70 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a  d lockTable())..
30e80 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72    */.  rc = quer
30e90 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c  yTableLock(p, 1,
30ea0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
30eb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30ec0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
30ed0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
30ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
30ef0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
30f00 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =0 && idx<=15 );
30f10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
30f20 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
30f30 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65  ger, 1, &pDbPage
30f40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
30f50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
30f60 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
30f70 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
30f80 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
30f90 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
30fa0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
30fb0 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65  );.  *pMeta = ge
30fc0 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
30fd0 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69   idx*4]);.  sqli
30fe0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
30ff0 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  bPage);..  /* If
31000 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73   autovacuumed is
31010 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69   disabled in thi
31020 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20 61  s build but we a
31030 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20  re trying to .  
31040 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75 74  ** access an aut
31050 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61  ovacuumed databa
31060 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68  se, then make th
31070 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64 6f  e database reado
31080 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65  nly. .  */.#ifde
31090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
310a0 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69  TOVACUUM.  if( i
310b0 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e  dx==4 && *pMeta>
310c0 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  0 ) pBt->readOnl
310d0 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20  y = 1;.#endif.. 
310e0 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65 61   /* Grab the rea
310f0 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
31100 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b  . */.  rc = lock
31110 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41 44  Table(p, 1, READ
31120 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65  _LOCK);.  sqlite
31130 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
31140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31150 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61  /*.** Write meta
31160 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63  -information bac
31170 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
31180 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73  ase.  Meta[0] is
31190 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  .** read-only an
311a0 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69  d may not be wri
311b0 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tten..*/.int sql
311c0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
311d0 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
311e0 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61  t idx, u32 iMeta
311f0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
31200 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
31210 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
31220 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  1;.  int rc;.  a
31230 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26  ssert( idx>=1 &&
31240 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71   idx<=15 );.  sq
31250 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
31260 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
31270 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e  p->db;.  if( p->
31280 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
31290 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  RITE ){.    rc =
312a0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
312b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
312c0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
312d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
312e0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
312f0 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31 20  1!=0 );.    pP1 
31300 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  = pBt->pPage1->a
31310 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 73  Data;.    rc = s
31320 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31330 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
31340 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31360 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
31370 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
31380 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65  , iMeta);.#ifnde
31390 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
313a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
313b0 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20  f( idx==7 ){.   
313c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
313d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20  ->autoVacuum || 
313e0 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  iMeta==0 );.    
313f0 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 65 74      assert( iMet
31400 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31  a==0 || iMeta==1
31410 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
31420 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 69 4d  >incrVacuum = iM
31430 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  eta;.      }.#en
31440 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  dif.    }.  }.  
31450 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
31460 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
31470 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
31480 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65  rn the flag byte
31490 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
314a0 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  g of the page th
314b0 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
314c0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
314d0 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
314e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c  t sqlite3BtreeFl
314f0 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ags(BtCursor *pC
31500 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
31510 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f  What about CURSO
31520 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
31530 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65  ate? Probably ne
31540 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20  ed to call.  ** 
31550 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
31560 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
31570 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
31580 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43 75  age;.  restoreCu
31590 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
315a0 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  r);.  pPage = pC
315b0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
315c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
315d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
315e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
315f0 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20 29  pBt==pCur->pBt )
31600 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
31610 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b   ? pPage->aData[
31620 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31630 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] : 0;.}.../*.**
31640 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
31650 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
31660 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69 73  h a BTree.  This
31670 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
31680 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
31690 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
316a0 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71  ly..*/.Pager *sq
316b0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
316c0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
316d0 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  urn p->pBt->pPag
316e0 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  er;.}..#ifndef S
316f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
31700 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
31710 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67   Append a messag
31720 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  e to the error m
31730 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a  essage string..*
31740 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
31750 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20  eckAppendMsg(.  
31760 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
31770 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73  eck,.  char *zMs
31780 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g1,.  const char
31790 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e   *zFormat,.  ...
317a0 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
317b0 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d  ;.  if( !pCheck-
317c0 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b  >mxErr ) return;
317d0 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  .  pCheck->mxErr
317e0 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45  --;.  pCheck->nE
317f0 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74  rr++;.  va_start
31800 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
31810 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72 72   if( pCheck->err
31820 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20 20  Msg.nChar ){.   
31830 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
31840 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e  Append(&pCheck->
31850 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31 29  errMsg, "\n", 1)
31860 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73 67  ;.  }.  if( zMsg
31870 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
31880 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
31890 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20  pCheck->errMsg, 
318a0 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d 0a  zMsg1, -1);.  }.
318b0 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e 74    sqlite3VXPrint
318c0 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73  f(&pCheck->errMs
318d0 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  g, 1, zFormat, a
318e0 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
318f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
31900 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
31910 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
31920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31930 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
31940 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
31950 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
31960 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
31970 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
31980 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
31990 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
319a0 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
319b0 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
319c0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
319d0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
319e0 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
319f0 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
31a00 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
31a10 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
31a20 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
31a30 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
31a40 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
31a50 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
31a60 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
31a70 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
31a80 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
31a90 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
31aa0 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61  , int iPage, cha
31ab0 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20  r *zContext){.  
31ac0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
31ad0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
31ae0 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61  Page>pCheck->nPa
31af0 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b  ge || iPage<0 ){
31b00 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
31b10 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
31b20 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70  text, "invalid p
31b30 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20  age number %d", 
31b40 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
31b50 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
31b60 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
31b70 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63  age]==1 ){.    c
31b80 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31b90 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
31ba0 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74  "2nd reference t
31bb0 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  o page %d", iPag
31bc0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
31bd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20  ;.  }.  return  
31be0 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69  (pCheck->anRef[i
31bf0 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23  Page]++)>1;.}..#
31c00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31c10 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
31c20 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
31c30 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  he entry in the 
31c40 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20  pointer-map for 
31c50 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73  page iChild maps
31c60 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61   to .** page iPa
31c70 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79  rent, pointer ty
31c80 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e  pe ptrType. If n
31c90 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72  ot, append an er
31ca0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74  ror message.** t
31cb0 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61  o pCheck..*/.sta
31cc0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74  tic void checkPt
31cd0 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74  rmap(.  Integrit
31ce0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f  yCk *pCheck,   /
31cf0 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
31d00 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  k context */.  P
31d10 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
31d20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70        /* Child p
31d30 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
31d40 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
31d50 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
31d60 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74  ed pointer map t
31d70 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ype */.  Pgno iP
31d80 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  arent,          
31d90 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
31da0 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70  ter map parent p
31db0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
31dc0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
31dd0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
31de0 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75  t description (u
31df0 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73  sed for error ms
31e00 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  g) */.){.  int r
31e10 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54  c;.  u8 ePtrmapT
31e20 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  ype;.  Pgno iPtr
31e30 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63  mapParent;..  rc
31e40 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68   = ptrmapGet(pCh
31e50 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64  eck->pBt, iChild
31e60 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20  , &ePtrmapType, 
31e70 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b  &iPtrmapParent);
31e80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
31e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63  E_OK ){.    chec
31ea0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31eb0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61  k, zContext, "Fa
31ec0 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72  iled to read ptr
31ed0 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68  map key=%d", iCh
31ee0 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
31ef0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74  ;.  }..  if( ePt
31f00 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20  rmapType!=eType 
31f10 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  || iPtrmapParent
31f20 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  !=iParent ){.   
31f30 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31f40 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31f50 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74  , .      "Bad pt
31f60 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d  r map entry key=
31f70 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c  %d expected=(%d,
31f80 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22  %d) got=(%d,%d)"
31f90 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c  , .      iChild,
31fa0 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c   eType, iParent,
31fb0 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50   ePtrmapType, iP
31fc0 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
31fd0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
31fe0 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
31ff0 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
32000 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f  elist or of an o
32010 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
32020 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  t..** Verify tha
32030 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
32040 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73  pages on the lis
32050 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  t is N..*/.stati
32060 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74  c void checkList
32070 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
32080 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74  *pCheck,  /* Int
32090 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
320a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
320b0 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20   isFreeList,    
320c0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
320d0 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73   freelist.  Fals
320e0 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e for overflow p
320f0 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  age list */.  in
32100 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
32110 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
32120 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  er for first pag
32130 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  e in the list */
32140 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
32150 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
32160 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70  cted number of p
32170 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
32180 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
32190 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43  text        /* C
321a0 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
321b0 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a   messages */.){.
321c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65    int i;.  int e
321d0 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69  xpected = N;.  i
321e0 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67  nt iFirst = iPag
321f0 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  e;.  while( N-- 
32200 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  > 0 && pCheck->m
32210 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61  xErr ){.    DbPa
32220 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20  ge *pOvflPage;. 
32230 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
32240 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20   *pOvflData;.   
32250 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
32260 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
32270 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
32280 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
32290 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
322a0 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
322b0 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
322c0 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
322d0 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
322e0 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
322f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
32300 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
32310 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
32320 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
32330 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
32340 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65  te3PagerGet(pChe
32350 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e  ck->pPager, (Pgn
32360 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50  o)iPage, &pOvflP
32370 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  age) ){.      ch
32380 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32390 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
323a0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61  failed to get pa
323b0 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
323c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
323d0 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61   }.    pOvflData
323e0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
323f0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
32400 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67  GetData(pOvflPag
32410 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72  e);.    if( isFr
32420 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  eeList ){.      
32430 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65  int n = get4byte
32440 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b  (&pOvflData[4]);
32450 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32460 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32470 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
32480 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
32490 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
324a0 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
324b0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
324c0 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
324d0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
324e0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
324f0 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
32500 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b  sableSize/4-2 ){
32510 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
32520 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32530 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
32540 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
32550 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
32560 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
32570 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
32580 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
32590 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
325a0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
325b0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
325c0 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
325d0 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a  (&pOvflData[8+i*
325e0 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
325f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32600 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66  UUM.          if
32610 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
32620 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
32630 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74           checkPt
32640 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72  rmap(pCheck, iFr
32650 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46  eePage, PTRMAP_F
32660 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
32670 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
32680 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
32690 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68      checkRef(pCh
326a0 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
326b0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
326c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d     }.        N -
326d0 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
326e0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
326f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32700 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  M.    else{.    
32710 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
32720 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
32730 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69  uto-vacuum and i
32740 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Page is not the 
32750 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61  last.      ** pa
32760 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66  ge in this overf
32770 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20  low list, check 
32780 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72  that the pointer
32790 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20  -map entry for. 
327a0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
327b0 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68  owing page match
327c0 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20  es iPage..      
327d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  */.      if( pCh
327e0 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
327f0 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20  cuum && N>0 ){. 
32800 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62         i = get4b
32810 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
32820 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
32830 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
32840 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
32850 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
32860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
32870 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
32880 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
32890 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  flData);.    sql
328a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
328b0 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  OvflPage);.  }.}
328c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
328d0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
328e0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
328f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
32900 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
32910 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20  *.** Do various 
32920 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  sanity checks on
32930 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
32940 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72  f a tree.  Retur
32950 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65  n.** the tree de
32960 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73  pth.  Root pages
32970 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65   return 0.  Pare
32980 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  nts of root page
32990 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61  s.** return 1, a
329a0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20  nd so forth..** 
329b0 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73  .** These checks
329c0 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a   are done:.**.**
329d0 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73        1.  Make s
329e0 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61  ure that cells a
329f0 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f  nd freeblocks do
32a00 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20   not overlap.** 
32a10 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d           but com
32a20 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  bine to complete
32a30 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67  ly cover the pag
32a40 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d  e..**  NO  2.  M
32a50 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65  ake sure cell ke
32a60 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e  ys are in order.
32a70 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b  .**  NO  3.  Mak
32a80 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
32a90 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
32aa0 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75  ual to zLowerBou
32ab0 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20  nd..**  NO  4.  
32ac0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
32ad0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
32ae0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70   or equal to zUp
32af0 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20  perBound..**    
32b00 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20    5.  Check the 
32b10 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65  integrity of ove
32b20 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20  rflow pages..** 
32b30 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69       6.  Recursi
32b40 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54  vely call checkT
32b50 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63  reePage on all c
32b60 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20  hildren..**     
32b70 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74   7.  Verify that
32b80 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c   the depth of al
32b90 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68  l children is th
32ba0 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20  e same..**      
32bb0 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  8.  Make sure th
32bc0 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65  is page is at le
32bd0 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20  ast 33% full or 
32be0 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20  else it is.**   
32bf0 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20         the root 
32c00 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  of the tree..*/.
32c10 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
32c20 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65  TreePage(.  Inte
32c30 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
32c40 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
32c50 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
32c60 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  k */.  int iPage
32c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32c80 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
32c90 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b  he page to check
32ca0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
32cb0 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
32cc0 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
32cd0 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e  char *zParentCon
32ce0 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20  text  /* Parent 
32cf0 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
32d00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
32d10 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70    int i, rc, dep
32d20 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e  th, d2, pgno, cn
32d30 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65  t;.  int hdr, ce
32d40 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e  llStart;.  int n
32d50 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61  Cell;.  u8 *data
32d60 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
32d70 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  t;.  int usableS
32d80 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e  ize;.  char zCon
32d90 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61  text[100];.  cha
32da0 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74  r *hit;..  sqlit
32db0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
32dc0 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
32dd0 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64  ontext, "Page %d
32de0 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20  : ", iPage);..  
32df0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
32e00 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20  e page exists.  
32e10 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63  */.  pBt = pChec
32e20 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65  k->pBt;.  usable
32e30 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
32e40 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50  leSize;.  if( iP
32e50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
32e60 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  0;.  if( checkRe
32e70 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
32e80 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29   zParentContext)
32e90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
32ea0 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
32eb0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
32ec0 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
32ed0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b  pPage, 0))!=0 ){
32ee0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
32ef0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
32f00 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e  text,.       "un
32f10 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
32f20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65  page. error code
32f30 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72  =%d", rc);.    r
32f40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
32f50 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
32f60 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
32f70 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d  age, pParent))!=
32f80 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
32f90 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32fa0 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
32fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73                "s
32fc0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
32fd0 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72  age() returns er
32fe0 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63  ror code %d", rc
32ff0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
33000 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
33010 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
33020 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c  /* Check out all
33030 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   the cells..  */
33040 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20  .  depth = 0;.  
33050 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
33060 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63  ->nCell && pChec
33070 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  k->mxErr; i++){.
33080 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
33090 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43     int sz;.    C
330a0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
330b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c     /* Check payl
330c0 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  oad overflow pag
330d0 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  es.    */.    sq
330e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
330f0 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c  izeof(zContext),
33100 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
33110 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65          "On tree
33120 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
33130 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
33140 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
33150 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
33160 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
33170 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
33180 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
33190 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
331a0 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21  nData;.    if( !
331b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20  pPage->intKey ) 
331c0 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b  sz += info.nKey;
331d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d  .    assert( sz=
331e0 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
331f0 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66  ;.    if( sz>inf
33200 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
33210 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73    int nPage = (s
33220 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  z - info.nLocal 
33230 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35  + usableSize - 5
33240 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  )/(usableSize - 
33250 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  4);.      Pgno p
33260 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
33270 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
33280 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e  Overflow]);.#ifn
33290 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
332a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
332b0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
332c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
332d0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
332e0 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  ck, pgnoOvfl, PT
332f0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
33300 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
33310 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
33320 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74  .      checkList
33330 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f  (pCheck, 0, pgno
33340 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f  Ovfl, nPage, zCo
33350 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  ntext);.    }.. 
33360 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69     /* Check sani
33370 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64  ty of left child
33380 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
33390 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
333a0 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  af ){.      pgno
333b0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
333c0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
333d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
333e0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
333f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
33400 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
33410 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
33420 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
33430 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
33440 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
33450 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63  .      d2 = chec
33460 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
33470 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e  ,pgno,pPage,zCon
33480 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  text);.      if(
33490 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74   i>0 && d2!=dept
334a0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  h ){.        che
334b0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
334c0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43  ck, zContext, "C
334d0 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20  hild page depth 
334e0 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20  differs");.     
334f0 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d   }.      depth =
33500 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   d2;.    }.  }. 
33510 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
33520 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
33530 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
33540 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
33550 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
33560 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33570 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
33580 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  t), zContext, . 
33590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335a0 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20      "On page %d 
335b0 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20  at right child: 
335c0 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64  ", iPage);.#ifnd
335d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
335e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
335f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
33600 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  m ){.      check
33610 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
33620 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
33630 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20  E, iPage, 0);.  
33640 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
33650 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
33660 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  eck, pgno, pPage
33670 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  , zContext);.  }
33680 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  . .  /* Check fo
33690 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72  r complete cover
336a0 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a  age of the page.
336b0 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50    */.  data = pP
336c0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
336d0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
336e0 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71  fset;.  hit = sq
336f0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
33700 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
33710 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a 20  ;.  if( hit ){. 
33720 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 30     memset(hit, 0
33730 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  , usableSize );.
33740 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20      memset(hit, 
33750 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  1, get2byte(&dat
33760 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20  a[hdr+5]));.    
33770 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
33780 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
33790 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20      cellStart = 
337a0 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
337b0 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f  ge->leaf;.    fo
337c0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
337d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
337e0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
337f0 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a  ata[cellStart+i*
33800 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20 73  2]);.      u16 s
33810 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
33820 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
33830 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  c]);.      int j
33840 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63 2b  ;.      if( (pc+
33850 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
33860 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20  ize || pc<0 ){. 
33870 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
33880 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
33890 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
338a0 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
338b0 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
338c0 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
338d0 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
338e0 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
338f0 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70  =pc+size-1; j>=p
33900 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  c; j--) hit[j]++
33910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33920 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69      for(cnt=0, i
33930 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
33940 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20  hdr+1]); i>0 && 
33950 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  i<usableSize && 
33960 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20  cnt<10000; .    
33970 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20         cnt++){. 
33980 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
33990 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
339a0 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  +2]);.      int 
339b0 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b  j;.      if( (i+
339c0 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
339d0 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20  ize || i<0 ){.  
339e0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
339f0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
33a00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
33a10 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
33a20 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
33a30 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
33a40 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
33a50 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
33a60 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b  =i+size-1; j>=i;
33a70 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a   j--) hit[j]++;.
33a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
33a90 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
33aa0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
33ab0 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75  for(i=cnt=0; i<u
33ac0 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b  sableSize; i++){
33ad0 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b 69  .      if( hit[i
33ae0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
33af0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
33b00 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20  se if( hit[i]>1 
33b10 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
33b20 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
33b30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22  , 0,.          "
33b40 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f  Multiple uses fo
33b50 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61 67  r byte %d of pag
33b60 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29  e %d", i, iPage)
33b70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
33b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33b90 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61     if( cnt!=data
33ba0 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20  [hdr+7] ){.     
33bb0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
33bc0 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
33bd0 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65        "Fragmente
33be0 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62 79  d space is %d by
33bf0 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 25  te reported as %
33c00 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20  d on page %d",. 
33c10 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61           cnt, da
33c20 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65  ta[hdr+7], iPage
33c30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
33c40 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 68  qlite3PageFree(h
33c50 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50  it);..  releaseP
33c60 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
33c70 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a  turn depth+1;.}.
33c80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
33c90 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
33ca0 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
33cb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
33cc0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
33cd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
33ce0 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65   does a complete
33cf0 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69   check of the gi
33d00 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20  ven BTree file. 
33d10 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61   aRoot[] is.** a
33d20 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65 73  n array of pages
33d30 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65 61   numbers were ea
33d40 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ch page number i
33d50 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
33d60 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20  of.** a table.  
33d70 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d  nRoot is the num
33d80 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
33d90 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  n aRoot..**.** I
33da0 66 20 65 76 65 72 79 74 68 69 6e 67 20 63 68 65  f everything che
33db0 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f  cks out, this ro
33dc0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
33dd0 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e  LL.  If somethin
33de0 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61  g is.** amiss, a
33df0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
33e00 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
33e10 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
33e20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  from malloc().**
33e30 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
33e40 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73  o that error mes
33e50 73 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  sage is returned
33e60 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
33e70 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
33e80 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72  sponsible for fr
33e90 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  eeing the error 
33ea0 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20  message when it 
33eb0 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72  is done..*/.char
33ec0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e   *sqlite3BtreeIn
33ed0 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20  tegrityCheck(.  
33ee0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a  Btree *p,     /*
33ef0 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   The btree to be
33f00 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   checked */.  in
33f10 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41  t *aRoot,   /* A
33f20 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20  n array of root 
33f30 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f  pages numbers fo
33f40 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65  r individual tre
33f50 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f  es */.  int nRoo
33f60 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  t,    /* Number 
33f70 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
33f80 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d  oot[] */.  int m
33f90 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70  xErr,    /* Stop
33fa0 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72   reporting error
33fb0 73 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e  s after this man
33fc0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72  y */.  int *pnEr
33fd0 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75  r    /* Write nu
33fe0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
33ff0 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69  een to this vari
34000 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
34010 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a   i;.  int nRef;.
34020 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43    IntegrityCk sC
34030 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64  heck;.  BtShared
34040 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
34050 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30 30 5d    char zErr[100]
34060 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
34070 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
34080 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
34090 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
340a0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
340b0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
340c0 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
340d0 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ry(p)!=SQLITE_OK
340e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
340f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
34100 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
34110 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20 74  StrDup("Unable t
34120 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
34130 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
34140 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73  abase");.  }.  s
34150 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b  Check.pBt = pBt;
34160 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72  .  sCheck.pPager
34170 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
34180 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
34190 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
341a0 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a  sCheck.pPager);.
341b0 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d    sCheck.mxErr =
341c0 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b   mxErr;.  sCheck
341d0 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a 70 6e  .nErr = 0;.  *pn
341e0 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  Err = 0;.#ifndef
341f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34200 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
34210 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  t->nTrunc!=0 ){.
34220 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65      sCheck.nPage
34230 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a   = pBt->nTrunc;.
34240 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
34250 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30   sCheck.nPage==0
34260 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74   ){.    unlockBt
34270 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
34280 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
34290 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
342a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
342b0 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73  sCheck.anRef = s
342c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73  qlite3Malloc( (s
342d0 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
342e0 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
342f0 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  ef[0]) );.  if( 
34300 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b  !sCheck.anRef ){
34310 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
34320 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
34330 20 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20     *pnErr = 1;. 
34340 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
34350 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
34360 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  urn sqlite3MPrin
34370 74 66 28 70 2d 3e 64 62 2c 20 22 55 6e 61 62 6c  tf(p->db, "Unabl
34380 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62  e to malloc %d b
34390 79 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20  ytes", .        
343a0 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29  (sCheck.nPage+1)
343b0 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61  *sizeof(sCheck.a
343c0 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  nRef[0]));.  }. 
343d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68   for(i=0; i<=sCh
343e0 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  eck.nPage; i++){
343f0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
34400 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45   = 0; }.  i = PE
34410 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
34420 70 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73  pBt);.  if( i<=s
34430 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20  Check.nPage ){. 
34440 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b     sCheck.anRef[
34450 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  i] = 1;.  }.  sq
34460 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
34470 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67  t(&sCheck.errMsg
34480 2c 20 7a 45 72 72 2c 20 73 69 7a 65 6f 66 28 7a  , zErr, sizeof(z
34490 45 72 72 29 2c 20 32 30 30 30 30 29 3b 0a 0a 20  Err), 20000);.. 
344a0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e   /* Check the in
344b0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66  tegrity of the f
344c0 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63  reelist.  */.  c
344d0 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b  heckList(&sCheck
344e0 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28 26 70  , 1, get4byte(&p
344f0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
34500 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20  a[32]),.        
34510 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 42      get4byte(&pB
34520 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
34530 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65  [36]), "Main fre
34540 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a  elist: ");..  /*
34550 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74   Check all the t
34560 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
34570 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26  r(i=0; i<nRoot &
34580 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
34590 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52  i++){.    if( aR
345a0 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  oot[i]==0 ) cont
345b0 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  inue;.#ifndef SQ
345c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
345d0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
345e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
345f0 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20  aRoot[i]>1 ){.  
34600 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
34610 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69  &sCheck, aRoot[i
34620 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  ], PTRMAP_ROOTPA
34630 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  GE, 0, 0);.    }
34640 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63  .#endif.    chec
34650 6b 54 72 65 65 50 61 67 65 28 26 73 43 68 65 63  kTreePage(&sChec
34660 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20  k, aRoot[i], 0, 
34670 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f  "List of tree ro
34680 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20  ots: ");.  }..  
34690 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65  /* Make sure eve
346a0 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  ry page in the f
346b0 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63 65  ile is reference
346c0 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31  d.  */.  for(i=1
346d0 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67  ; i<=sCheck.nPag
346e0 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72  e && sCheck.mxEr
346f0 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20  r; i++){.#ifdef 
34700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
34710 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73  VACUUM.    if( s
34720 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d  Check.anRef[i]==
34730 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  0 ){.      check
34740 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
34750 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69  k, 0, "Page %d i
34760 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69  s never used", i
34770 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  );.    }.#else. 
34780 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
34790 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
347a0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65  uto-vacuum, make
347b0 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20   sure no tables 
347c0 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72  contain.    ** r
347d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69  eferences to poi
347e0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a  nter-map pages..
347f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
34800 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d  Check.anRef[i]==
34810 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54  0 && .       (PT
34820 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
34830 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e   i)!=i || !pBt->
34840 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20  autoVacuum) ){. 
34850 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
34860 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
34870 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65  "Page %d is neve
34880 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20  r used", i);.   
34890 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63   }.    if( sChec
348a0 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26  k.anRef[i]!=0 &&
348b0 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50   .       (PTRMAP
348c0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d  _PAGENO(pBt, i)=
348d0 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56  =i && pBt->autoV
348e0 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20  acuum) ){.      
348f0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
34900 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e  sCheck, 0, "Poin
34910 74 65 72 20 6d 61 70 20 70 61 67 65 20 25 64 20  ter map page %d 
34920 69 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20  is referenced", 
34930 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  i);.    }.#endif
34940 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
34950 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73  sure this analys
34960 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65  is did not leave
34970 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67   any unref() pag
34980 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b  es.  */.  unlock
34990 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
349a0 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21  t);.  if( nRef !
349b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
349c0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
349d0 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  er) ){.    check
349e0 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
349f0 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75  k, 0, .      "Ou
34a00 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63  tstanding page c
34a10 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25  ount goes from %
34a20 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74  d to %d during t
34a30 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20  his analysis",. 
34a40 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74       nRef, sqlit
34a50 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
34a60 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20  pBt->pPager).   
34a70 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   );.  }..  /* Cl
34a80 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f  ean  up and repo
34a90 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  rt errors..  */.
34aa0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
34ab0 61 76 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ave(p);.  sqlite
34ac0 33 5f 66 72 65 65 28 73 43 68 65 63 6b 2e 61 6e  3_free(sCheck.an
34ad0 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d  Ref);.  *pnErr =
34ae0 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20   sCheck.nErr;.  
34af0 69 66 28 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d  if( sCheck.nErr=
34b00 3d 30 20 29 20 73 71 6c 69 74 65 33 53 74 72 41  =0 ) sqlite3StrA
34b10 63 63 75 6d 52 65 73 65 74 28 26 73 43 68 65 63  ccumReset(&sChec
34b20 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72 65 74  k.errMsg);.  ret
34b30 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
34b40 63 75 6d 46 69 6e 69 73 68 28 26 73 43 68 65 63  cumFinish(&sChec
34b50 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e  k.errMsg);.}.#en
34b60 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
34b70 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
34b80 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CK */../*.** Ret
34b90 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
34ba0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64  hname of the und
34bb0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
34bc0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
34bd0 20 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20   pager filename 
34be0 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
34bf0 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
34c00 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
34c10 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
34c20 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
34c30 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
34c40 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
34c50 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
34c60 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  ilename(Btree *p
34c70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
34c80 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
34c90 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
34ca0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
34cb0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
34cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
34cd0 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
34ce0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
34cf0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
34d00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
34d10 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
34d20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69  directory name i
34d30 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
34d40 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
34d50 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
34d60 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
34d70 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
34d80 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
34d90 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
34da0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69  qlite3BtreeGetDi
34db0 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  rname(Btree *p){
34dc0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
34dd0 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
34de0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
34df0 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e  PagerDirname(p->
34e00 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
34e10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
34e20 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
34e30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
34e40 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
34e50 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20  . The return.** 
34e60 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f  value of this ro
34e70 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d  utine is the sam
34e80 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  e regardless of 
34e90 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72  whether the jour
34ea0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  nal file.** has 
34eb0 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20  been created or 
34ec0 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  not..**.** The p
34ed0 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ager journal fil
34ee0 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61  ename is invaria
34ef0 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
34f00 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
34f10 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
34f20 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
34f30 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
34f40 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
34f50 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
34f60 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
34f70 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
34f80 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
34f90 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
34fa0 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
34fb0 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70  Journalname(p->p
34fc0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
34fd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34fe0 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
34ff0 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65   Copy the comple
35000 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42  te content of pB
35010 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f  tFrom into pBtTo
35020 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
35030 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69  .** must be acti
35040 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65  ve for both file
35050 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  s..**.** The siz
35060 65 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61  e of file pTo ma
35070 79 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20  y be reduced by 
35080 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
35090 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
350a0 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74  oes wrong, the t
350b0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54  ransaction on pT
350c0 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o is rolled back
350d0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
350e0 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68  essful, CommitPh
350f0 61 73 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20  aseOne() may be 
35100 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65  called on pTo be
35110 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
35120 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
35130 68 6f 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d  hould finish com
35140 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e  mitting the tran
35150 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62  saction on pTo b
35160 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  y calling.** sql
35170 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
35180 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
35190 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42   btreeCopyFile(B
351a0 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
351b0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
351c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
351d0 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e    Pgno i;..  Pgn
351e0 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20  o nFromPage;    
351f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
35200 67 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a  ges in pFrom */.
35210 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20    Pgno nToPage; 
35220 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35230 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20  of pages in pTo 
35240 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61  */.  Pgno nNewPa
35250 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ge;      /* Numb
35260 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
35270 54 6f 20 61 66 74 65 72 20 74 68 65 20 63 6f 70  To after the cop
35280 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b  y */..  Pgno iSk
35290 69 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ip;         /* P
352a0 65 6e 64 69 6e 67 20 62 79 74 65 20 70 61 67 65  ending byte page
352b0 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74   in pTo */.  int
352c0 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20   nToPageSize;   
352d0 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66   /* Page size of
352e0 20 70 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f   pTo in bytes */
352f0 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65  .  int nFromPage
35300 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73  Size;  /* Page s
35310 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20  ize of pFrom in 
35320 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68  bytes */..  BtSh
35330 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54  ared *pBtTo = pT
35340 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72  o->pBt;.  BtShar
35350 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46  ed *pBtFrom = pF
35360 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54  rom->pBt;.  pBtT
35370 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b  o->db = pTo->db;
35380 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d  .  pBtFrom->db =
35390 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e   pFrom->db;..  n
353a0 54 6f 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  ToPageSize = pBt
353b0 54 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  To->pageSize;.  
353c0 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20  nFromPageSize = 
353d0 70 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a  pBtFrom->pageSiz
353e0 65 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69  e;..  if( pTo->i
353f0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
35400 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e  ITE || pFrom->in
35410 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
35420 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
35430 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
35440 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e   }.  if( pBtTo->
35450 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
35460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
35470 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67  Y;.  }..  nToPag
35480 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
35490 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  nt(pBtTo->pPager
354a0 29 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d  );.  nFromPage =
354b0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
354c0 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29  pBtFrom->pPager)
354d0 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44  ;.  iSkip = PEND
354e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
354f0 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69  tTo);..  /* Vari
35500 61 62 6c 65 20 6e 4e 65 77 50 61 67 65 20 69 73  able nNewPage is
35510 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
35520 61 67 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ages required to
35530 20 73 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20   store the.  ** 
35540 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46 72 6f  contents of pFro
35550 6d 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  m using the curr
35560 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  ent page-size of
35570 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65   pTo..  */.  nNe
35580 77 50 61 67 65 20 3d 20 28 28 69 36 34 29 6e 46  wPage = ((i64)nF
35590 72 6f 6d 50 61 67 65 20 2a 20 28 69 36 34 29 6e  romPage * (i64)n
355a0 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b 20 28  FromPageSize + (
355b0 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 20  i64)nToPageSize 
355c0 2d 20 31 29 20 2f 20 0a 20 20 20 20 20 20 28 69  - 1) / .      (i
355d0 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a  64)nToPageSize;.
355e0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d  .  for(i=1; rc==
355f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c  SQLITE_OK && (i<
35600 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e  =nToPage || i<=n
35610 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a  NewPage); i++){.
35620 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20  .    /* Journal 
35630 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
35640 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
35650 20 69 53 6b 69 70 20 69 73 20 74 68 65 20 70 61   iSkip is the pa
35660 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
35670 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 28 50   locking page (P
35680 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
35690 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61 74 61  ).    ** in data
356a0 62 61 73 65 20 2a 70 54 6f 20 28 62 65 66 6f 72  base *pTo (befor
356b0 65 20 74 68 65 20 63 6f 70 79 29 2e 20 54 68 69  e the copy). Thi
356c0 73 20 70 61 67 65 20 69 73 20 6e 65 76 65 72 20  s page is never 
356d0 77 72 69 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20  written .    ** 
356e0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
356f0 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d   file. Unless i=
35700 3d 69 53 6b 69 70 20 6f 72 20 74 68 65 20 70 61  =iSkip or the pa
35710 67 65 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a  ge was not.    *
35720 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 70 54 6f  * present in pTo
35730 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79   before the copy
35740 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72   operation, jour
35750 6e 61 6c 20 70 61 67 65 20 69 20 66 72 6f 6d 20  nal page i from 
35760 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  pTo..    */.    
35770 69 66 28 20 69 21 3d 69 53 6b 69 70 20 26 26 20  if( i!=iSkip && 
35780 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20  i<=nToPage ){.  
35790 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
357a0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
357b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
357c0 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  Get(pBtTo->pPage
357d0 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b  r, i, &pDbPage);
357e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
357f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35810 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
35820 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
35830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
35840 26 20 69 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b  & i>nFromPage ){
35850 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 59 65  .          /* Ye
35860 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69  ah.  It seems wi
35870 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74  erd to call Dont
35880 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66  Write() right af
35890 74 65 72 20 57 72 69 74 65 28 29 2e 20 42 75 74  ter Write(). But
358a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
358b0 61 74 20 69 73 20 62 65 63 61 75 73 65 20 74 68  at is because th
358c0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65  e names of those
358d0 20 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e   procedures do n
358e0 6f 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20  ot exactly .    
358f0 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65        ** represe
35900 6e 74 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e  nt what they do.
35910 20 20 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79    Write() really
35920 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68 69 73   means "put this
35930 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20   page in the.   
35940 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61         ** rollba
35950 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d  ck journal and m
35960 61 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20  ark it as dirty 
35970 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
35980 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  be written.     
35990 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64       ** to the d
359a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c 61 74  atabase file lat
359b0 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74 65 28  er."  DontWrite(
359c0 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73 65 63  ) undoes the sec
359d0 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20 20 20  ond part of.    
359e0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e        ** that an
359f0 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  d prevents the p
35a00 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77  age from being w
35a10 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
35a20 74 61 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20  tabase. The.    
35a30 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
35a40 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f   still on the ro
35a50 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
35a60 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61  though.  And tha
35a70 74 20 69 73 20 74 68 65 20 0a 20 20 20 20 20 20  t is the .      
35a80 20 20 20 20 2a 2a 20 77 68 6f 6c 65 20 70 6f 69      ** whole poi
35a90 6e 74 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b  nt of this block
35aa0 3a 20 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f  : to put pages o
35ab0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
35ac0 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 20  ournal. .       
35ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
35ae0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
35af0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
35b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35b10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
35b20 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
35b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
35b40 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 74 68   /* Overwrite th
35b50 65 20 64 61 74 61 20 69 6e 20 70 61 67 65 20 69  e data in page i
35b60 20 6f 66 20 74 68 65 20 74 61 72 67 65 74 20 64   of the target d
35b70 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 69  atabase */.    i
35b80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35b90 20 26 26 20 69 21 3d 69 53 6b 69 70 20 26 26 20   && i!=iSkip && 
35ba0 69 3c 3d 6e 4e 65 77 50 61 67 65 20 29 7b 0a 0a  i<=nNewPage ){..
35bb0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 54        DbPage *pT
35bc0 6f 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  oPage = 0;.     
35bd0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
35be0 4f 66 66 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  Off;..      rc =
35bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
35c00 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
35c10 69 2c 20 26 70 54 6f 50 61 67 65 29 3b 0a 20 20  i, &pToPage);.  
35c20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35c30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35c50 65 72 57 72 69 74 65 28 70 54 6f 50 61 67 65 29  erWrite(pToPage)
35c60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
35c70 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 69 4f   for(.        iO
35c80 66 66 3d 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65  ff=(i-1)*nToPage
35c90 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20 72  Size; .        r
35ca0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
35cb0 69 4f 66 66 3c 69 2a 6e 54 6f 50 61 67 65 53 69  iOff<i*nToPageSi
35cc0 7a 65 3b 20 0a 20 20 20 20 20 20 20 20 69 4f 66  ze; .        iOf
35cd0 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69  f += nFromPageSi
35ce0 7a 65 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ze.      ){.    
35cf0 20 20 20 20 44 62 50 61 67 65 20 2a 70 46 72 6f      DbPage *pFro
35d00 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  mPage = 0;.     
35d10 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20     Pgno iFrom = 
35d20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53  (iOff/nFromPageS
35d30 69 7a 65 29 2b 31 3b 0a 0a 20 20 20 20 20 20 20  ize)+1;..       
35d40 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44   if( iFrom==PEND
35d50 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
35d60 74 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  tFrom) ){.      
35d70 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
35d80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
35d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35da0 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70  erGet(pBtFrom->p
35db0 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70  Pager, iFrom, &p
35dc0 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
35dd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35de0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35df0 20 20 63 68 61 72 20 2a 7a 54 6f 20 3d 20 73 71    char *zTo = sq
35e00 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
35e10 61 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20  a(pToPage);.    
35e20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 72 6f        char *zFro
35e30 6d 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  m = sqlite3Pager
35e40 47 65 74 44 61 74 61 28 70 46 72 6f 6d 50 61 67  GetData(pFromPag
35e50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  e);.          in
35e60 74 20 6e 43 6f 70 79 3b 0a 0a 20 20 20 20 20 20  t nCopy;..      
35e70 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61 67      if( nFromPag
35e80 65 53 69 7a 65 3e 3d 6e 54 6f 50 61 67 65 53 69  eSize>=nToPageSi
35e90 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
35ea0 20 20 7a 46 72 6f 6d 20 2b 3d 20 28 28 69 2d 31    zFrom += ((i-1
35eb0 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20  )*nToPageSize - 
35ec0 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d  ((iFrom-1)*nFrom
35ed0 50 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  PageSize));.    
35ee0 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20          nCopy = 
35ef0 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  nToPageSize;.   
35f00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35f10 20 20 20 20 20 20 20 20 20 20 7a 54 6f 20 2b 3d            zTo +=
35f20 20 28 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72   (((iFrom-1)*nFr
35f30 6f 6d 50 61 67 65 53 69 7a 65 29 20 2d 20 28 69  omPageSize) - (i
35f40 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65 29  -1)*nToPageSize)
35f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  ;.            nC
35f60 6f 70 79 20 3d 20 6e 46 72 6f 6d 50 61 67 65 53  opy = nFromPageS
35f70 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
35f80 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ..          memc
35f90 70 79 28 7a 54 6f 2c 20 7a 46 72 6f 6d 2c 20 6e  py(zTo, zFrom, n
35fa0 43 6f 70 79 29 3b 0a 09 20 20 73 71 6c 69 74 65  Copy);..  sqlite
35fb0 33 50 61 67 65 72 55 6e 72 65 66 28 70 46 72 6f  3PagerUnref(pFro
35fc0 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
35fd0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
35fe0 20 69 66 28 20 70 54 6f 50 61 67 65 20 29 20 73   if( pToPage ) s
35ff0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36000 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 7d  (pToPage);.    }
36010 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
36020 69 6e 67 73 20 68 61 76 65 20 77 6f 72 6b 65 64  ings have worked
36030 20 73 6f 20 66 61 72 2c 20 74 68 65 20 64 61 74   so far, the dat
36040 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 6e  abase file may n
36050 65 65 64 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20  eed to be .  ** 
36060 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 63  truncated. The c
36070 6f 6d 70 6c 65 78 20 70 61 72 74 20 69 73 20 74  omplex part is t
36080 68 61 74 20 69 74 20 6d 61 79 20 6e 65 65 64 20  hat it may need 
36090 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  to be truncated 
360a0 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a 65 20 74  to.  ** a size t
360b0 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  hat is not an in
360c0 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
360d0 66 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20  f nToPageSize - 
360e0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
360f0 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
36100 62 79 20 74 68 65 20 70 61 67 65 72 20 61 73 73  by the pager ass
36110 6f 63 69 61 74 65 64 20 77 69 74 68 20 42 2d 54  ociated with B-T
36120 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a 0a 20 20  ree pTo..  **.  
36130 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
36140 73 61 79 20 74 68 65 20 70 61 67 65 2d 73 69 7a  say the page-siz
36150 65 20 6f 66 20 70 54 6f 20 69 73 20 32 30 34 38  e of pTo is 2048
36160 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 6f   bytes and the o
36170 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a 20 6e 75  riginal .  ** nu
36180 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 73  mber of pages is
36190 20 35 20 28 31 30 20 4b 42 20 66 69 6c 65 29 2e   5 (10 KB file).
361a0 20 49 66 20 70 46 72 6f 6d 20 68 61 73 20 61 20   If pFrom has a 
361b0 70 61 67 65 20 73 69 7a 65 20 6f 66 20 31 30 32  page size of 102
361c0 34 20 0a 20 20 2a 2a 20 62 79 74 65 73 20 61 6e  4 .  ** bytes an
361d0 64 20 39 20 70 61 67 65 73 2c 20 74 68 65 6e 20  d 9 pages, then 
361e0 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73 20 74  the file needs t
361f0 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  o be truncated t
36200 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20 20 69 66  o 9KB..  */.  if
36210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36220 29 7b 0a 20 20 20 20 69 66 28 20 6e 46 72 6f 6d  ){.    if( nFrom
36230 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f 50 61 67  PageSize!=nToPag
36240 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  eSize ){.      s
36250 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
36260 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  le = sqlite3Page
36270 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e 70 50 61  rFile(pBtTo->pPa
36280 67 65 72 29 3b 0a 20 20 20 20 20 20 69 36 34 20  ger);.      i64 
36290 69 53 69 7a 65 20 3d 20 28 69 36 34 29 6e 46 72  iSize = (i64)nFr
362a0 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20 28 69 36  omPageSize * (i6
362b0 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a 20 20 20  4)nFromPage;.   
362c0 20 20 20 69 36 34 20 69 4e 6f 77 20 3d 20 28 69     i64 iNow = (i
362d0 36 34 29 28 28 6e 54 6f 50 61 67 65 3e 6e 4e 65  64)((nToPage>nNe
362e0 77 50 61 67 65 29 3f 6e 54 6f 50 61 67 65 3a 6e  wPage)?nToPage:n
362f0 4e 65 77 50 61 67 65 29 20 2a 20 28 69 36 34 29  NewPage) * (i64)
36300 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20  nToPageSize; .  
36310 20 20 20 20 69 36 34 20 69 50 65 6e 64 69 6e 67      i64 iPending
36320 20 3d 20 28 28 69 36 34 29 50 45 4e 44 49 4e 47   = ((i64)PENDING
36330 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f  _BYTE_PAGE(pBtTo
36340 29 2d 31 29 20 2a 28 69 36 34 29 6e 54 6f 50 61  )-1) *(i64)nToPa
36350 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20 20 20 20  geSize;.  .     
36360 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3c 3d   assert( iSize<=
36370 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20 20 20 20  iNow );.  .     
36380 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68 61 73 65   /* Commit phase
36390 20 6f 6e 65 20 73 79 6e 63 73 20 74 68 65 20 6a   one syncs the j
363a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f  ournal file asso
363b0 63 69 61 74 65 64 20 77 69 74 68 20 70 54 6f 20  ciated with pTo 
363c0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  .      ** contai
363d0 6e 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ning the origina
363e0 6c 20 64 61 74 61 2e 20 49 74 20 64 6f 65 73 20  l data. It does 
363f0 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 64 61 74  not sync the dat
36400 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
36410 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41 66 74 65   ** itself. Afte
36420 72 20 64 6f 69 6e 67 20 74 68 69 73 20 69 74 20  r doing this it 
36430 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 4f  is safe to use O
36440 73 54 72 75 6e 63 61 74 65 28 29 20 61 6e 64 20  sTruncate() and 
36450 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
36460 69 6c 65 20 41 50 49 73 20 6f 6e 20 74 68 65 20  ile APIs on the 
36470 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 69  database file di
36480 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  rectly..      */
36490 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e 64 62  .      pBtTo->db
364a0 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20 20 20   = pTo->db;.    
364b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
364c0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
364d0 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  e(pBtTo->pPager,
364e0 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20   0, 0, 1);.     
364f0 20 69 66 28 20 69 53 69 7a 65 3c 69 4e 6f 77 20   if( iSize<iNow 
36500 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
36510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
36520 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
36530 74 65 28 70 46 69 6c 65 2c 20 69 53 69 7a 65 29  te(pFile, iSize)
36540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
36550 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74     /* The loop t
36560 68 61 74 20 63 6f 70 69 65 64 20 64 61 74 61 20  hat copied data 
36570 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 70 46  from database pF
36580 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69 64 20 6e  rom to pTo did n
36590 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70 6f 70 75  ot.      ** popu
365a0 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  late the locking
365b0 20 70 61 67 65 20 6f 66 20 64 61 74 61 62 61 73   page of databas
365c0 65 20 70 54 6f 2e 20 49 66 20 74 68 65 20 70 61  e pTo. If the pa
365d0 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  ge-size of.     
365e0 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20 73 6d 61   ** pFrom is sma
365f0 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74 20 6f  ller than that o
36600 66 20 70 54 6f 2c 20 74 68 69 73 20 6d 65 61 6e  f pTo, this mean
36610 73 20 73 6f 6d 65 20 64 61 74 61 20 77 69 6c 6c  s some data will
36620 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61  .      ** not ha
36630 76 65 20 62 65 65 6e 20 63 6f 70 69 65 64 2e 20  ve been copied. 
36640 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
36650 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f  ** This block co
36660 70 69 65 73 20 74 68 65 20 6d 69 73 73 69 6e 67  pies the missing
36670 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61 62   data from datab
36680 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f  ase pFrom to pTo
36690 20 0a 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67   .      ** using
366a0 20 66 69 6c 65 20 41 50 49 73 2e 20 54 68 69 73   file APIs. This
366b0 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
366c0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 77   at this point w
366d0 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20 20 20 20  e know that.    
366e0 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74 68 65 20    ** all of the 
366f0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66 72  original data fr
36700 6f 6d 20 70 54 6f 20 68 61 73 20 62 65 65 6e 20  om pTo has been 
36710 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
36720 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
36730 6c 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  l file. At this 
36740 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62  point it would b
36750 65 20 73 61 66 65 20 74 6f 20 64 6f 20 61 6e 79  e safe to do any
36760 74 68 69 6e 67 20 61 74 0a 20 20 20 20 20 20 2a  thing at.      *
36770 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20 64 61 74  * all to the dat
36780 61 62 61 73 65 20 66 69 6c 65 20 65 78 63 65 70  abase file excep
36790 74 20 74 72 75 6e 63 61 74 65 20 69 74 20 74 6f  t truncate it to
367a0 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a 20 20 20   zero bytes..   
367b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
367c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
367d0 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3c 6e   nFromPageSize<n
367e0 54 6f 50 61 67 65 53 69 7a 65 20 26 26 20 69 53  ToPageSize && iS
367f0 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29 7b 0a 20  ize>iPending){. 
36800 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 3b         i64 iOff;
36810 0a 20 20 20 20 20 20 20 20 66 6f 72 28 0a 20 20  .        for(.  
36820 20 20 20 20 20 20 20 20 69 4f 66 66 3d 69 50 65          iOff=iPe
36830 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20 20 20 20  nding; .        
36840 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
36850 26 26 20 69 4f 66 66 3c 28 69 50 65 6e 64 69 6e  && iOff<(iPendin
36860 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b 20  g+nToPageSize); 
36870 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
36880 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  += nFromPageSize
36890 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
368a0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 46        DbPage *pF
368b0 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  romPage = 0;.   
368c0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 6f         Pgno iFro
368d0 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50  m = (iOff/nFromP
368e0 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20 20 0a 20  ageSize)+1;.  . 
368f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
36900 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  om==PENDING_BYTE
36910 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20 7c  _PAGE(pBtFrom) |
36920 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f 6d 50 61 67  | iFrom>nFromPag
36930 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
36940 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
36950 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
36960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36970 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d  PagerGet(pBtFrom
36980 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c  ->pPager, iFrom,
36990 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20   &pFromPage);.  
369a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
369b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
369c0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
369d0 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50 61  From = sqlite3Pa
369e0 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f 6d  gerGetData(pFrom
369f0 50 61 67 65 29 3b 0a 20 20 09 20 20 72 63 20 3d  Page);.  .  rc =
36a00 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
36a10 70 46 69 6c 65 2c 20 7a 46 72 6f 6d 2c 20 6e 46  pFile, zFrom, nF
36a20 72 6f 6d 50 61 67 65 53 69 7a 65 2c 20 69 4f 66  romPageSize, iOf
36a30 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
36a40 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36a50 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20  f(pFromPage);.  
36a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36a70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20    }.      }.  . 
36a80 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65       /* Sync the
36a90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
36aa0 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
36ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36ac0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36ad0 33 50 61 67 65 72 53 79 6e 63 28 70 42 74 54 6f  3PagerSync(pBtTo
36ae0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
36af0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36b00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36b10 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 42  PagerTruncate(pB
36b20 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 4e 65  tTo->pPager, nNe
36b30 77 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  wPage);.    }.  
36b40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36b50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 42 74  _OK ){.      pBt
36b60 54 6f 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  To->pageSizeFixe
36b70 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 0;.    }.  }
36b80 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
36b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
36ba0 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d  llback(pTo);.  }
36bb0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
36bc0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
36bd0 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65  reeCopyFile(Btre
36be0 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70  e *pTo, Btree *p
36bf0 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  From){.  int rc;
36c00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
36c10 6e 74 65 72 28 70 54 6f 29 3b 0a 20 20 73 71 6c  nter(pTo);.  sql
36c20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
36c30 46 72 6f 6d 29 3b 0a 20 20 72 63 20 3d 20 62 74  From);.  rc = bt
36c40 72 65 65 43 6f 70 79 46 69 6c 65 28 70 54 6f 2c  reeCopyFile(pTo,
36c50 20 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74   pFrom);.  sqlit
36c60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 46 72  e3BtreeLeave(pFr
36c70 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  om);.  sqlite3Bt
36c80 72 65 65 4c 65 61 76 65 28 70 54 6f 29 3b 0a 20  reeLeave(pTo);. 
36c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
36ca0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
36cb0 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a  OMIT_VACUUM */..
36cc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
36cd0 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e 73  -zero if a trans
36ce0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
36cf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36d00 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 42  BtreeIsInTrans(B
36d10 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
36d20 72 74 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69  rt( p==0 || sqli
36d30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36d40 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
36d50 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
36d60 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
36d70 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a  S_WRITE));.}../*
36d80 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
36d90 65 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d 65  ero if a stateme
36da0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
36db0 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
36dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
36dd0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
36de0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36df0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
36e00 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
36e10 20 28 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70   (p->pBt && p->p
36e20 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a  Bt->inStmt);.}..
36e30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
36e40 2d 7a 65 72 6f 20 69 66 20 61 20 72 65 61 64 20  -zero if a read 
36e50 28 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73  (or write) trans
36e60 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
36e70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36e80 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61  BtreeIsInReadTra
36e90 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ns(Btree *p){.  
36ea0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
36eb0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
36ec0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
36ed0 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69  turn (p && (p->i
36ee0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
36ef0 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  NE));.}../*.** T
36f00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
36f10 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
36f20 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  o a blob of memo
36f30 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
36f40 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73  th.** a single s
36f50 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54 68 65  hared-btree. The
36f60 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20   memory is used 
36f70 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65 20 66  by client code f
36f80 6f 72 20 69 74 73 20 6f 77 6e 0a 2a 2a 20 70 75  or its own.** pu
36f90 72 70 6f 73 65 73 20 28 66 6f 72 20 65 78 61 6d  rposes (for exam
36fa0 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20 61 20  ple, to store a 
36fb0 68 69 67 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d  high-level schem
36fc0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
36fd0 68 20 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64  h .** the shared
36fe0 2d 62 74 72 65 65 29 2e 20 54 68 65 20 62 74 72  -btree). The btr
36ff0 65 65 20 6c 61 79 65 72 20 6d 61 6e 61 67 65 73  ee layer manages
37000 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
37010 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a  ing issues..**.*
37020 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
37030 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
37040 6f 6e 20 61 20 73 68 61 72 65 64 2d 62 74 72 65  on a shared-btre
37050 65 2c 20 6e 42 79 74 65 73 20 62 79 74 65 73 20  e, nBytes bytes 
37060 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65  of memory.** are
37070 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f   allocated, zero
37080 65 64 2c 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ed, and returned
37090 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
370a0 46 6f 72 20 65 61 63 68 20 73 75 62 73 65 71 75  For each subsequ
370b0 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65  ent .** call the
370c0 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74 65   nBytes paramete
370d0 72 20 69 73 20 69 67 6e 6f 72 65 64 20 61 6e 64  r is ignored and
370e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
370f0 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f  e same blob.** o
37100 66 20 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e 65  f memory returne
37110 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  d. .**.** If the
37120 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74 65   nBytes paramete
37130 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 62  r is 0 and the b
37140 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 68 61  lob of memory ha
37150 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
37160 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 20 6e  * allocated, a n
37170 75 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 72  ull pointer is r
37180 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
37190 62 6c 6f 62 20 68 61 73 20 61 6c 72 65 61 64 79  blob has already
371a0 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74   been.** allocat
371b0 65 64 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  ed, it is return
371c0 65 64 20 61 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2a  ed as normal..**
371d0 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20  .** Just before 
371e0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
371f0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20   is closed, the 
37200 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20  function passed 
37210 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65  as the .** xFree
37220 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74   argument when t
37230 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
37240 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73  tion was made is
37250 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20   invoked on the 
37260 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f  .** blob of allo
37270 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68  cated memory. Th
37280 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
37290 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69  ld not call sqli
372a0 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e  te3_free().** on
372b0 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65   the memory, the
372c0 20 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65   btree layer doe
372d0 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20  s that..*/.void 
372e0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68  *sqlite3BtreeSch
372f0 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ema(Btree *p, in
37300 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a  t nBytes, void(*
37310 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b  xFree)(void *)){
37320 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
37330 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
37340 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
37350 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  );.  if( !pBt->p
37360 53 63 68 65 6d 61 20 26 26 20 6e 42 79 74 65 73  Schema && nBytes
37370 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63   ){.    pBt->pSc
37380 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d 61  hema = sqlite3Ma
37390 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73 29  llocZero(nBytes)
373a0 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65  ;.    pBt->xFree
373b0 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a  Schema = xFree;.
373c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
373d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
373e0 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d  turn pBt->pSchem
373f0 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
37400 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74 68  rn true if anoth
37410 65 72 20 75 73 65 72 20 6f 66 20 74 68 65 20 73  er user of the s
37420 61 6d 65 20 73 68 61 72 65 64 20 62 74 72 65 65  ame shared btree
37430 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
37440 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73  .** handle holds
37450 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
37460 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  ck on the sqlite
37470 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a  _master table..*
37480 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
37490 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42  eeSchemaLocked(B
374a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
374b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
374c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
374d0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
374e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
374f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
37500 20 28 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b   (queryTableLock
37510 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
37520 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c   READ_LOCK)!=SQL
37530 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
37540 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
37550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37560 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
37570 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
37580 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  HE./*.** Obtain 
37590 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
375a0 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70  ble whose root p
375b0 61 67 65 20 69 73 20 69 54 61 62 2e 20 20 54 68  age is iTab.  Th
375c0 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77  e.** lock is a w
375d0 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73 57  rite lock if isW
375e0 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75 65  ritelock is true
375f0 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a   or a read lock.
37600 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c 73  ** if it is fals
37610 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
37620 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28  3BtreeLockTable(
37630 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
37640 61 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c 6f  ab, u8 isWriteLo
37650 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
37660 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
37670 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
37680 20 20 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20      u8 lockType 
37690 3d 20 52 45 41 44 5f 4c 4f 43 4b 20 2b 20 69 73  = READ_LOCK + is
376a0 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 61  WriteLock;.    a
376b0 73 73 65 72 74 28 20 52 45 41 44 5f 4c 4f 43 4b  ssert( READ_LOCK
376c0 2b 31 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  +1==WRITE_LOCK )
376d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
376e0 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20  WriteLock==0 || 
376f0 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29  isWriteLock==1 )
37700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
37710 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
37720 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
37730 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63  ock(p, iTab, loc
37740 6b 54 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20  kType);.    if( 
37750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37760 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
37770 54 61 62 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c  Table(p, iTab, l
37780 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a  ockType);.    }.
37790 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
377a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
377b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
377c0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
377d0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
377e0 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  B./*.** Argument
377f0 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61 20   pCsr must be a 
37800 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f  cursor opened fo
37810 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e 20  r writing on an 
37820 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  .** INTKEY table
37830 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
37840 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 74  ing at a valid t
37850 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a 20  able entry. .** 
37860 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f  This function mo
37870 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61 20  difies the data 
37880 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
37890 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a 2a  f that entry..**
378a0 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 63   Only the data c
378b0 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 20  ontent may only 
378c0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74 20  be modified, it 
378d0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a  is not possible.
378e0 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
378f0 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
37900 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69  ata stored..*/.i
37910 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
37920 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  utData(BtCursor 
37930 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCsr, u32 offse
37940 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
37950 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *z){.  assert( 
37960 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
37970 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCsr) );.  asse
37980 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
37990 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70 42 74  x_held(pCsr->pBt
379a0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
379b0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 43 73 72  );.  assert(pCsr
379c0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
379d0 6c 65 29 3b 0a 0a 20 20 72 65 73 74 6f 72 65 43  le);..  restoreC
379e0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
379f0 73 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  sr);.  assert( p
37a00 43 73 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Csr->eState!=CUR
37a10 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
37a20 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65  );.  if( pCsr->e
37a30 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
37a40 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
37a50 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
37a60 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
37a70 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74 69 6f  some preconditio
37a80 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61 29 20  ns: .  **   (a) 
37a90 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
37aa0 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a  en for writing,.
37ab0 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65 72 65    **   (b) there
37ac0 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b   is no read-lock
37ad0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65   on the table be
37ae0 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  ing modified and
37af0 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68 65 20  .  **   (c) the 
37b00 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74  cursor points at
37b10 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f 66 20   a valid row of 
37b20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e  an intKey table.
37b30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 43 73  .  */.  if( !pCs
37b40 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  r->wrFlag ){.   
37b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
37b60 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61  EADONLY;.  }.  a
37b70 73 73 65 72 74 28 20 21 70 43 73 72 2d 3e 70 42  ssert( !pCsr->pB
37b80 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20  t->readOnly .   
37b90 20 20 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e         && pCsr->
37ba0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
37bb0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
37bc0 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  );.  if( checkRe
37bd0 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42  adLocks(pCsr->pB
37be0 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f  tree, pCsr->pgno
37bf0 52 6f 6f 74 2c 20 70 43 73 72 2c 20 30 29 20 29  Root, pCsr, 0) )
37c00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
37c10 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
37c20 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
37c30 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
37c40 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20  ad lock */.  }. 
37c50 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74   if( pCsr->eStat
37c60 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
37c70 44 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61 67  D || !pCsr->pPag
37c80 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
37c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
37ca0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
37cb0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
37cc0 64 28 70 43 73 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCsr, offset, 
37cd0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
37ce0 68 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a  har *)z, 0, 1);.
37cf0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20  }../* .** Set a 
37d00 66 6c 61 67 20 6f 6e 20 74 68 69 73 20 63 75 72  flag on this cur
37d10 73 6f 72 20 74 6f 20 63 61 63 68 65 20 74 68 65  sor to cache the
37d20 20 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70 61   locations of pa
37d30 67 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ges from the .**
37d40 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 66   overflow list f
37d50 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
37d60 6f 77 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ow. This is used
37d70 20 62 79 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   by cursors open
37d80 65 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d  ed.** for increm
37d90 65 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e  ental blob IO on
37da0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ly..**.** This f
37db0 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66  unction sets a f
37dc0 6c 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63  lag only. The ac
37dd0 74 75 61 6c 20 70 61 67 65 20 6c 6f 63 61 74 69  tual page locati
37de0 6f 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f  on cache.** (sto
37df0 72 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72 2e  red in BtCursor.
37e00 61 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20  aOverflow[]) is 
37e10 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 75 73  allocated and us
37e20 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a  ed by function.*
37e30 2a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  * accessPayload(
37e40 29 20 28 74 68 65 20 77 6f 72 6b 65 72 20 66 75  ) (the worker fu
37e50 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74  nction for sqlit
37e60 65 33 42 74 72 65 65 44 61 74 61 28 29 20 61 6e  e3BtreeData() an
37e70 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  d.** sqlite3Btre
37e80 65 50 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a  ePutData())..*/.
37e90 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
37ea0 65 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28 42  eCacheOverflow(B
37eb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
37ec0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
37ed0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
37ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
37ef0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
37f00 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
37f10 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
37f20 73 73 65 72 74 28 21 70 43 75 72 2d 3e 69 73 49  ssert(!pCur->isI
37f30 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a  ncrblobHandle);.
37f40 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
37f50 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
37f60 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
37f70 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64  ndle = 1;.}.#end
37f80 69 66 0a                                         if.