/ Hex Artifact Content
Login

Artifact 8b8697ab5e8ca9aad12221bb9abfee1aed7a5cd1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 35 36 38 20 32 30 30 39 2f 30  c,v 1.568 2009/0
0190: 32 2f 32 34 20 31 36 3a 31 38 3a 30 35 20 64 72  2/24 16:18:05 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72  eTrace=0;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74  .** A list of Bt
0450: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74  Shared objects t
0460: 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65  hat are eligible
0470: 20 66 6f 72 20 70 61 72 74 69 63 69 70 61 74 69   for participati
0480: 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20  on.** in shared 
0490: 63 61 63 68 65 2e 20 20 54 68 69 73 20 76 61 72  cache.  This var
04a0: 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73  iable has file s
04b0: 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d  cope during norm
04c0: 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75  al builds,.** bu
04d0: 74 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65  t the test harne
04e0: 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65  ss needs to acce
04f0: 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65  ss it so we make
0500: 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a   it global for .
0510: 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a  ** test builds..
0520: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0530: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0540: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0550: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0560: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0570: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0580: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
0590: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
05a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
05b0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
05c0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
05d0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
05e0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
05f0: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0600: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0610: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0620: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0630: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0640: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0650: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0660: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0670: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0680: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0690: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
06a0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
06b0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
06c0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
06d0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
06e0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
06f0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0700: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0710: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0720: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0730: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0740: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0750: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0760: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
0770: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0780: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
0790: 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  nt checkReadLock
07a0: 73 28 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20  s(Btree*, Pgno, 
07b0: 42 74 43 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b  BtCursor*, i64);
07c0: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
07d0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
07e0: 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  HE.  /*.  ** The
07f0: 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79   functions query
0800: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63  TableLock(), loc
0810: 6b 54 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c  kTable() and unl
0820: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20  ockAllTables(). 
0830: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0840: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0850: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0860: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
0870: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
0880: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
0890: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
08a0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
08b0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
08c0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
08d0: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
08e0: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
08f0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0900: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0910: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0920: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0930: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0940: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0950: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0960: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
0970: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
0980: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
0990: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61  queryTableLock(a
09a0: 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,b,c) SQLITE_OK.
09b0: 20 20 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61    #define lockTa
09c0: 62 6c 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ble(a,b,c) SQLIT
09d0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75  E_OK.  #define u
09e0: 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61  nlockAllTables(a
09f0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
0a00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0a10: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
0a20: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
0a30: 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   btree handle p 
0a40: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
0a50: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
0a60: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
0a70: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
0a80: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
0a90: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
0aa0: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
0ab0: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
0ac0: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
0ad0: 28 62 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b  (by calling lock
0ae0: 54 61 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20  Table()), or.** 
0af0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
0b00: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
0b10: 69 6e 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  int queryTableLo
0b20: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
0b30: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
0b40: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
0b50: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
0b60: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
0b70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
0b80: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
0b90: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
0ba0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
0bb0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
0bc0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
0bd0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
0be0: 20 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61   .  /* This is a
0bf0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68   no-op if the sh
0c00: 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f  ared-cache is no
0c10: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  t enabled */.  i
0c20: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
0c30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
0c40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
0c50: 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72  /* If some other
0c60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
0c70: 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  olding an exclus
0c80: 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20  ive lock, the.  
0c90: 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  ** requested loc
0ca0: 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74  k may not be obt
0cb0: 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ained..  */.  if
0cc0: 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76  ( pBt->pExclusiv
0cd0: 65 20 26 26 20 70 42 74 2d 3e 70 45 78 63 6c 75  e && pBt->pExclu
0ce0: 73 69 76 65 21 3d 70 20 29 7b 0a 20 20 20 20 72  sive!=p ){.    r
0cf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
0d00: 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  KED;.  }..  /* T
0d10: 68 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20  his (along with 
0d20: 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20  lockTable()) is 
0d30: 77 68 65 72 65 20 74 68 65 20 52 65 61 64 55 6e  where the ReadUn
0d40: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
0d50: 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  s.  ** dealt wit
0d60: 68 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  h. If the caller
0d70: 20 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72   is querying for
0d80: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
0d90: 61 6e 79 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  any table.  ** o
0da0: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 73 71  ther than the sq
0db0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
0dc0: 65 20 28 74 61 62 6c 65 20 31 29 20 61 6e 64 20  e (table 1) and 
0dd0: 69 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  if the ReadUncom
0de0: 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 6c 61 67  mitted.  ** flag
0df0: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0e00: 65 20 6c 6f 63 6b 20 67 72 61 6e 74 65 64 20 65  e lock granted e
0e10: 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ven if there are
0e20: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a   write-locks.  *
0e30: 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  * on the table. 
0e40: 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  If a write-lock 
0e50: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
0e60: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
0e70: 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e  d flag.  ** is n
0e80: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20  ot considered.. 
0e90: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63   **.  ** In func
0ea0: 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29  tion lockTable()
0eb0: 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b  , if a read-lock
0ec0: 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64   is demanded and
0ed0: 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55   the .  ** ReadU
0ee0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
0ef0: 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79  is set, no entry
0f00: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
0f10: 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a   locks list .  *
0f20: 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  * (BtShared.pLoc
0f30: 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  k)..  **.  ** To
0f40: 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74   summarize: If t
0f50: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
0f60: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
0f70: 74 68 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72  then read cursor
0f80: 73 0a 20 20 2a 2a 20 6f 6e 20 6e 6f 6e 2d 73 63  s.  ** on non-sc
0f90: 68 65 6d 61 20 74 61 62 6c 65 73 20 64 6f 20 6e  hema tables do n
0fa0: 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65 73  ot create or res
0fb0: 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73  pect table locks
0fc0: 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  . The locking.  
0fd0: 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72  ** procedure for
0fe0: 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
0ff0: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e  does not change.
1000: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
1010: 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67   0==(p->db->flag
1020: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
1030: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
1040: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
1050: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
1060: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
1070: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
1080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1090: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
10a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
10b0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
10c0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
10d0: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20  ble==iTab && .  
10e0: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
10f0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20  eLock!=eLock || 
1100: 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b  eLock!=READ_LOCK
1110: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
1120: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1130: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
1140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1150: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1160: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
1170: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
1180: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1190: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
11a0: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
11b0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
11c0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
11d0: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
11e0: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
11f0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
1200: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
1210: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
1220: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
1230: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
1240: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
1250: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1260: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
1270: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
1280: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
1290: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
12a0: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
12b0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
12c0: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
12d0: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
12e0: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
12f0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1300: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
1310: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
1320: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1330: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1340: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1350: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1360: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1370: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  LOCK || eLock==W
1380: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RITE_LOCK );.  a
1390: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
13a0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  );..  /* This is
13b0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
13c0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
13d0: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
13e0: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
13f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
1400: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1410: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1420: 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c  _OK==queryTableL
1430: 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65  ock(p, iTable, e
1440: 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  Lock) );..  /* I
1450: 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  f the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
1470: 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  et and a read-lo
1480: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 20  ck is requested 
1490: 6f 6e 0a 20 20 2a 2a 20 61 20 6e 6f 6e 2d 73 63  on.  ** a non-sc
14a0: 68 65 6d 61 20 74 61 62 6c 65 2c 20 74 68 65 6e  hema table, then
14b0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 6c 77   the lock is alw
14c0: 61 79 73 20 67 72 61 6e 74 65 64 2e 20 20 52 65  ays granted.  Re
14d0: 74 75 72 6e 20 65 61 72 6c 79 0a 20 20 2a 2a 20  turn early.  ** 
14e0: 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67 20 61  without adding a
14f0: 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 42  n entry to the B
1500: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69  tShared.pLock li
1510: 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d  st. See.  ** com
1520: 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ment in function
1530: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
1540: 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20  ) for more info 
1550: 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a  on handling .  *
1560: 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  * the ReadUncomm
1570: 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f  itted flag..  */
1580: 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e  .  if( .    (p->
1590: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
15a0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
15b0: 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b  ) && .    (eLock
15c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a  ==READ_LOCK) &&.
15d0: 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53 54      iTable!=MAST
15e0: 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20  ER_ROOT.  ){.   
15f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1600: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72  K;.  }..  /* Fir
1610: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
1620: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
1630: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
1640: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
1650: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1660: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1670: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1680: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
1690: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
16a0: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
16b0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
16c0: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
16d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
16e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
16f0: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
1700: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
1710: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
1720: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
1730: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
1740: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
1750: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
1760: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
1770: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
1780: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
1790: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
17a0: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
17b0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
17c0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
17d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
17e0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
17f0: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
1800: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
1810: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1820: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
1830: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
1840: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
1850: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
1860: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
1870: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
1880: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
1890: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
18a0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
18b0: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
18c0: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
18d0: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
18e0: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
18f0: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
1900: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
1910: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
1920: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
1930: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1940: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
1950: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
1960: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
1970: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
1980: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
1990: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
19a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
19b0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
19c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
19d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19e0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
19f0: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
1a00: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
1a10: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
1a20: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
1a30: 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28  o the lockTable(
1a40: 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20  ).** procedure) 
1a50: 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61  held by Btree ha
1a60: 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69  ndle p..*/.stati
1a70: 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c  c void unlockAll
1a80: 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29  Tables(Btree *p)
1a90: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1aa0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
1ab0: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
1ac0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
1ad0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1ae0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1af0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1b00: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
1b10: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20 20 77  =*ppIter );..  w
1b20: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
1b30: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
1b40: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
1b50: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
1b60: 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
1b70: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d  pBt->pExclusive=
1b80: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
1b90: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
1ba0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
1bb0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
1bc0: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
1bd0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1be0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Lock);.    }else
1bf0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
1c00: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
1c10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1c20: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
1c30: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
1c40: 70 45 78 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a  pExclusive = 0;.
1c50: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1c60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1c70: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
1c80: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
1c90: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
1ca0: 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  age);  /* Forwar
1cb0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a  d reference */..
1cc0: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
1cd0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
1ce0: 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  ds a mutex on th
1cf0: 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  e BtShared.*/.#i
1d00: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
1d10: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f  tic int cursorHo
1d20: 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f  ldsMutex(BtCurso
1d30: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
1d40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d50: 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
1d60: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
1d70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d80: 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a  T_INCRBLOB./*.**
1d90: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
1da0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1db0: 73 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72  st cache for cur
1dc0: 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79  sor pCur, if any
1dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1de0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
1df0: 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f  lowCache(BtCurso
1e00: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
1e10: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e20: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
1e40: 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
1e50: 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e60: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
1e70: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
1e80: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1e90: 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63   cache for all c
1ea0: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
1eb0: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
1ec0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
1ed0: 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Bt..*/.static vo
1ee0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  id invalidateAll
1ef0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
1f00: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1f10: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
1f20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1f30: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1f40: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70  utex) );.  for(p
1f50: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
1f60: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1f70: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
1f80: 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20  rflowCache(p);. 
1f90: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65   }.}.#else.  #de
1fa0: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
1fb0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
1fc0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
1fd0: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1fe0: 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a  ache(x).#endif..
1ff0: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
2000: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
2010: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
2020: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
2030: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
2040: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
2050: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
2060: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
2070: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
2080: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
2090: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
20a0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
20b0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
20c0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
20d0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
20e0: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
20f0: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
2100: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
2110: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
2120: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2130: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2140: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
2150: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
2160: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
2170: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
2180: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
2190: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
21a0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
21b0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
21c0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
21d0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
21e0: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
21f0: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
2200: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
2210: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
2220: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
2230: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
2240: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
2250: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
2260: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
2270: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
2280: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
2290: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
22a0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
22b0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
22c0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
22d0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
22e0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
22f0: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
2300: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
2310: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
2320: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
2330: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
2340: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
2350: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
2360: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
2370: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
2380: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
2390: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
23a0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
23b0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
23c0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
23d0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
23e0: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
23f0: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
2400: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
2410: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
2420: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
2430: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
2440: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
2450: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
2460: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
2470: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
2480: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
2490: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
24a0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
24b0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
24c0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
24d0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
24e0: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
24f0: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
2500: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
2510: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
2520: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
2530: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
2540: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
2550: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
2560: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
2570: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
2580: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
2590: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
25a0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
25b0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
25c0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
25d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
25e0: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
25f0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
2600: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
2610: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
2620: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
2630: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
2640: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
2650: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
2660: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
2670: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
2680: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
2690: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
26a0: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
26b0: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
26c0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
26d0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
26e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26f0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
2700: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
2710: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2720: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2730: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
2740: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
2750: 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20     int nPage;.  
2760: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2770: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
2780: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
2790: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
27a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27b0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
27c0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
27d0: 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50  ecCreate((u32)nP
27e0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
27f0: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
2800: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
2810: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2820: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2830: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2840: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
2850: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
2860: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
2870: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
2880: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
2890: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
28a0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
28b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28c0: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
28d0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
28e0: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
28f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2900: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
2910: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
2920: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
2930: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
2940: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
2950: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
2960: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
2970: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
2980: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
2990: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
29a0: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
29b0: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
29c0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
29d0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
29e0: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
29f0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
2a00: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
2a10: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
2a20: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
2a30: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
2a40: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
2a50: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
2a60: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
2a70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
2a80: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
2a90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
2aa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
2ab0: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
2ac0: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
2ad0: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
2ae0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
2af0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2b00: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
2b10: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
2b20: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
2b30: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
2b40: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
2b50: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
2b60: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
2b70: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
2b80: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2b90: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
2ba0: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
2bb0: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
2bc0: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
2bd0: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
2be0: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
2bf0: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
2c00: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
2c10: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
2c20: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2c30: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2c40: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2c50: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
2c60: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
2c70: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
2c80: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2c90: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
2ca0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2cb0: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
2cc0: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
2cd0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2ce0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
2cf0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
2d00: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
2d10: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
2d20: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
2d30: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
2d40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2d50: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
2d60: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
2d70: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
2d80: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
2d90: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
2da0: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
2db0: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
2dc0: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
2dd0: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
2de0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
2df0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
2e00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e10: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61  && 0==pCur->apPa
2e20: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a  ge[0]->intKey){.
2e30: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
2e40: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
2e50: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
2e60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
2e70: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2e80: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
2e90: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
2ea0: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
2eb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2ec0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ed0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
2ee0: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
2ef0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f00: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
2f10: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2f20: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2f30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2f40: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2f50: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
2f60: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
2f70: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
2f80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f90: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2fa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
2fb0: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
2fc0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2fd0: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
2fe0: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
2ff0: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
3000: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
3010: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
3020: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
3030: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
3040: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
3050: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3060: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
3070: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
3080: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
3090: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
30a0: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
30b0: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
30c0: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
30d0: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
30e0: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
30f0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
3100: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
3110: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
3120: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
3130: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
3140: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
3150: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
3160: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
3170: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
3180: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
3190: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
31a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
31b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
31c0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
31d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
31e0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
31f0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
3200: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3210: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3220: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3230: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
3240: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
3250: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
3260: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
3270: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
3280: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
3290: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
32a0: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
32b0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
32c0: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
32d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
32f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3300: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3310: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
3320: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
3330: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
3340: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
3350: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
3360: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3370: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
3380: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3390: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
33a0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
33b0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
33c0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
33d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
33e0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
33f0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
3400: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
3410: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
3420: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
3430: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
3440: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
3450: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
3460: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
3470: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
3480: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
3490: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
34a0: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
34b0: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
34c0: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
34d0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
34e0: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
34f0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
3500: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
3510: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
3520: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
3530: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
3540: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
3550: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
3560: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
3570: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
3580: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
3590: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
35a0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
35b0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
35c0: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
35d0: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
35e0: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
35f0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
3600: 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  LID;.  rc = sqli
3610: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
3620: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
3630: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
3640: 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20  &pCur->skip);.  
3650: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3660: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
3670: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
3680: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
3690: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
36a0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
36b0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
36c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
36d0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
36e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36f0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
3700: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3710: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
3720: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
3730: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
3740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
3750: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
3760: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
3770: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
3780: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
3790: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
37a0: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
37b0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
37c0: 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61  osition it.** wa
37d0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74  s last placed at
37e0: 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  .  Cursors can m
37f0: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
3800: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
3810: 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65  ng.** at is dele
3820: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
3830: 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er them..**.** T
3840: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3850: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rns an error cod
3860: 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  e if something g
3870: 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a  oes wrong.  The.
3880: 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73  ** integer *pHas
3890: 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
38a0: 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  one if the curso
38b0: 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20  r has moved and 
38c0: 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74  0 if not..*/.int
38d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
38e0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
38f0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
3900: 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69  *pHasMoved){.  i
3910: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  nt rc;..  rc = r
3920: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
3930: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
3940: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61  ( rc ){.    *pHa
3950: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  sMoved = 1;.    
3960: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
3970: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
3980: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
3990: 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30  || pCur->skip!=0
39a0: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76   ){.    *pHasMov
39b0: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
39c0: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
39d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
39e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
39f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3a00: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
3a10: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
3a20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
3a30: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
3a40: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
3a50: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
3a60: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
3a70: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
3a80: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
3a90: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
3aa0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   page number..*/
3ab0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
3ac0: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
3ad0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
3ae0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
3af0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
3b00: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
3b10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3b20: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3b30: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3b40: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
3b50: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
3b60: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
3b70: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
3b80: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
3b90: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
3ba0: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
3bb0: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
3bc0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
3bd0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
3be0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
3bf0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
3c00: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
3c10: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
3c20: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
3c30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
3c40: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
3c50: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
3c60: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
3c70: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
3c80: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
3c90: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
3ca0: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
3cb0: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
3cc0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
3cd0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
3ce0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
3cf0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
3d00: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
3d10: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
3d20: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
3d30: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
3d40: 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20  rent){.  DbPage 
3d50: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
3d60: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
3d70: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
3d80: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
3d90: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
3da0: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
3db0: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
3dc0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3dd0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
3de0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
3df0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
3e00: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
3e10: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
3e20: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3e30: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3e40: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
3e50: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
3e60: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
3e70: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
3e80: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
3e90: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
3ea0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
3eb0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
3ec0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
3ed0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
3ee0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
3ef0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
3f00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3f10: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
3f20: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
3f30: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
3f40: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
3f50: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
3f60: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
3f70: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
3f80: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3f90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
3fa0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
3fb0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
3fc0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
3fd0: 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  key);.  pPtrmap 
3fe0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
3ff0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
4000: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
4010: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
4020: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
4030: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
4040: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
4050: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
4060: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
4070: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
4080: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
4090: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
40a0: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
40b0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
40c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
40d0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
40e0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
40f0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
4100: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
4110: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
4120: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67   }..  sqlite3Pag
4130: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
4140: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4150: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
4160: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
4170: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
4180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
4190: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
41a0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
41b0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
41c0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
41d0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
41e0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
41f0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
4200: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
4210: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
4220: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
4230: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4240: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
4250: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
4260: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
4270: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4280: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
4290: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
42a0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
42b0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
42c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
42d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
42e0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
42f0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
4300: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
4310: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
4320: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
4330: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
4340: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
4350: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
4360: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
4370: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4380: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4390: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
43a0: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
43b0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
43c0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
43d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
43e0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
43f0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
4400: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
4410: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4420: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
4430: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
4440: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
4450: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
4460: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
4470: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
4480: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
4490: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
44a0: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
44b0: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
44c0: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
44d0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
44e0: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
44f0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
4500: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
4510: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
4520: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
4530: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
4540: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
4550: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
4560: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
4570: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
4580: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
4590: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
45a0: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
45b0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
45c0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
45d0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
45e0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
45f0: 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  l(y,z) SQLITE_OK
4600: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
4610: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
4620: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
4630: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
4640: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
4650: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
4660: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
4670: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
4680: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
4690: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
46a0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
46b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
46c0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
46d0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
46e0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
46f0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
4700: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
4710: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
4720: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
4730: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
4740: 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c  ->aData[(P)->cel
4750: 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29  lOffset+2*(I)]))
4760: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  )../*.** This a 
4770: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
4780: 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c  sion of findCell
4790: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
47a0: 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20  r.** pages that 
47b0: 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  do contain overf
47c0: 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20  low cells.  See 
47d0: 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63  insert.*/.static
47e0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
47f0: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
4800: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
4810: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4820: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4830: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
4840: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4850: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
4860: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
4870: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
4880: 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66  .    struct _Ovf
4890: 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20  lCell *pOvfl;.  
48a0: 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65    pOvfl = &pPage
48b0: 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  ->aOvfl[i];.    
48c0: 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a  k = pOvfl->idx;.
48d0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
48e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
48f0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
4900: 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e    return pOvfl->
4910: 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pCell;.      }. 
4920: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
4930: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4940: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
4950: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
4960: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
4970: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
4980: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
4990: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
49a0: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
49b0: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
49c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73  his function.  s
49d0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
49e0: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
49f0: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
4a00: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
4a10: 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33  ment and sqlite3
4a20: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
4a30: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
4a40: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
4a50: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
4a60: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
4a70: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
4a80: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
4a90: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
4aa0: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
4ab0: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
4ac0: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
4ad0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
4ae0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
4af0: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
4b00: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64   faster..*/.void
4b10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4b20: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
4b30: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
4b40: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
4b50: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
4b60: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4b80: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
4b90: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
4ba0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
4bb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
4bc0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
4bd0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
4c00: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
4c10: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
4c20: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
4c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4c40: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
4c50: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
4c60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
4c70: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
4c80: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
4c90: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
4ca0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
4cb0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
4cc0: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
4cd0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
4ce0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
4cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
4d00: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
4d10: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
4d20: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
4d30: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
4d40: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
4d50: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
4d60: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
4d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4d80: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
4d90: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
4da0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
4db0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
4dc0: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
4dd0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
4de0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
4df0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
4e00: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
4e10: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
4e20: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
4e30: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
4e40: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
4e50: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
4e60: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
4e70: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
4e80: 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  n;.  if( likely(
4e90: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
4ea0: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
4eb0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
4ec0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
4ed0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
4ee0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
4ef0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
4f00: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
4f10: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
4f20: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
4f30: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
4f40: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
4f50: 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  ze of cell conte
4f60: 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  nt in bytes */. 
4f70: 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c     nSize = nPayl
4f80: 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  oad + n;.    pIn
4f90: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
4fa0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
4fb0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
4fc0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e   = 0;.    if( (n
4fd0: 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b  Size & ~3)==0 ){
4fe0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
4ff0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
5000: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
5010: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
5020: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
5030: 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  u16)nSize;.  }el
5040: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5050: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
5060: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
5070: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
5080: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
5090: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
50a0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
50b0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
50c0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
50d0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
50e0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
50f0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
5100: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
5110: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
5120: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
5130: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
5140: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
5150: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
5160: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
5170: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
5180: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
5190: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
51a0: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
51b0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
51c0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
51d0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
51e0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
51f0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
5200: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
5210: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
5220: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
5230: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
5240: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5250: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5260: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
5270: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
5280: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5290: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
52a0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
52b0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
52c0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
52d0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
52e0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
52f0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
5300: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
5310: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
5320: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
5330: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
5340: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
5350: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
5360: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
5370: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
5380: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
5390: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
53a0: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
53b0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
53c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
53d0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
53e0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
53f0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
5400: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
5410: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
5420: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
5430: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
5440: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
5450: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
5460: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
5470: 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  \.  sqlite3Btree
5480: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50  ParseCellPtr((pP
5490: 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28  age), findCell((
54a0: 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29  pPage), (iCell))
54b0: 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20  , (pInfo)).void 
54c0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
54d0: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
54e0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
54f0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
5500: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
5510: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
5520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5530: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
5540: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
5550: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
5560: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
5570: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
5580: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72  ture */.){.  par
5590: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
55a0: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ell, pInfo);.}..
55b0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
55c0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
55d0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
55e0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
55f0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
5600: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
5610: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
5620: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
5630: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
5640: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
5650: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
5660: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
5670: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
5680: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
5690: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
56a0: 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ter..*/.#ifndef 
56b0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31  NDEBUG.static u1
56c0: 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  6 cellSize(MemPa
56d0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
56e0: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
56f0: 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  o info;.  sqlite
5700: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
5710: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69  pPage, iCell, &i
5720: 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nfo);.  return i
5730: 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e  nfo.nSize;.}.#en
5740: 64 69 66 0a 73 74 61 74 69 63 20 75 31 36 20 63  dif.static u16 c
5750: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
5760: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
5770: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
5780: 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  o info;.  sqlite
5790: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
57a0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
57b0: 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72   &info);.  retur
57c0: 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a  n info.nSize;.}.
57d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
57e0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
57f0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
5800: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
5810: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
5820: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
5830: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
5840: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
5850: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
5860: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
5870: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
5880: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
5890: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
58a0: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
58b0: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
58c0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
58d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
58e0: 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l!=0 );.  sqlite
58f0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
5900: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
5910: 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
5920: 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
5930: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
5940: 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
5950: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
5960: 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
5970: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
5980: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
5990: 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
59a0: 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
59b0: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
59c0: 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
59d0: 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50    return ptrmapP
59e0: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
59f0: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
5a00: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
5a10: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
5a20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
5a30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
5a40: 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c   with index iCel
5a50: 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20  l on page pPage 
5a60: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
5a70: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
5a80: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
5a90: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
5aa0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
5ab0: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
5ac0: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
5ad0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
5ae0: 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tOvfl(MemPage *p
5af0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
5b00: 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  {.  u8 *pCell;. 
5b10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5b20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
5b30: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
5b40: 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
5b50: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
5b60: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65  ge, iCell);.  re
5b70: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76  turn ptrmapPutOv
5b80: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
5b90: 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ll);.}.#endif...
5ba0: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
5bb0: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
5bc0: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
5bd0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
5be0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
5bf0: 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61  and all free spa
5c00: 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ce is collected 
5c10: 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20  into one.** big 
5c20: 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63  FreeBlk that occ
5c30: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74  urs in between t
5c40: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65  he header and ce
5c50: 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72  ll.** pointer ar
5c60: 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ray and the cell
5c70: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a   content area..*
5c80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
5c90: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
5ca0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
5cb0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
5cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
5cd0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
5ce0: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
5cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
5d00: 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63  ress of a i-th c
5d10: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ell */.  int add
5d20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
5d30: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
5d40: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
5d50: 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  r cell pointer a
5d60: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rray */.  int hd
5d70: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
5d80: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
5d90: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
5da0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
5dd0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
5de0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
5df0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5e00: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
5e10: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
5e20: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
5e30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
5e40: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
5e50: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
5e60: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5e80: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
5e90: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
5ea0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
5ed0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
5ee0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5ef0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
5f00: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
5f10: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
5f20: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
5f30: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
5f40: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
5f50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5f60: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
5f70: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
5f80: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
5f90: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
5fa0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5fb0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5fc0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
5fd0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
5fe0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
5ff0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
6000: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6010: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6020: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6030: 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65  .  temp = sqlite
6040: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
6050: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
6060: 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  er);.  data = pP
6070: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
6080: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
6090: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
60a0: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
60b0: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
60c0: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
60d0: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
60e0: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
60f0: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
6100: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
6110: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6120: 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
6130: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
6140: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
6150: 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  p[cbrk], &data[c
6160: 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
6170: 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b   - cbrk);.  cbrk
6180: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
6190: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
61a0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
61b0: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
61c0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
61d0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
61e0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
61f0: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
6200: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
6210: 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Addr);.    if( p
6220: 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  c>=usableSize ){
6230: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6240: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
6250: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69 7a  T;.    }.    siz
6260: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  e = cellSizePtr(
6270: 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d  pPage, &temp[pc]
6280: 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73  );.    cbrk -= s
6290: 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72  ize;.    if( cbr
62a0: 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  k<cellOffset+2*n
62b0: 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  Cell || pc+size>
62c0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
62d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
62e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
62f0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
6300: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
6310: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
6320: 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  =0 );.    memcpy
6330: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74  (&data[cbrk], &t
6340: 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  emp[pc], size);.
6350: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
6360: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20  dr, cbrk);.  }. 
6370: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63   assert( cbrk>=c
6380: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
6390: 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l );.  put2byte(
63a0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
63b0: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
63c0: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
63d0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
63e0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
63f0: 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65  addr = cellOffse
6400: 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d  t+2*nCell;.  mem
6410: 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  set(&data[addr],
6420: 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a   0, cbrk-addr);.
6430: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6440: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6450: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6460: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
6470: 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e 46 72  addr!=pPage->nFr
6480: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
6490: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
64a0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
64b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
64c0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
64d0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
64e0: 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a  pace on a page..
64f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
6500: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
6510: 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68  e->aData[] of th
6520: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
6530: 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  ** the new alloc
6540: 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c 6c  ation.  The call
6550: 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  er guarantees th
6560: 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
6570: 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20 54 68  gh.** space.  Th
6580: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
6590: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  never fail..**.*
65a0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f  * If the page co
65b0: 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66  ntains nBytes of
65c0: 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74 20   free space but 
65d0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
65e0: 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f  .** nBytes of co
65f0: 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73 70  ntiguous free sp
6600: 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ace, then this r
6610: 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63  outine automatic
6620: 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65  ally.** calls de
6630: 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20  fragementPage() 
6640: 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61  to consolidate a
6650: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62 65  ll free space be
6660: 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  fore .** allocat
6670: 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e  ing the new chun
6680: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
6690: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
66a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
66b0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74  nt nByte){.  int
66c0: 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a   addr, pc, hdr;.
66d0: 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e    int size;.  in
66e0: 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74  t nFrag;.  int t
66f0: 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  op;.  int nCell;
6700: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
6710: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
6720: 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64  ar *data;.  .  d
6730: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
6740: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ta;.  assert( sq
6750: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
6760: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
6770: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
6780: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
6790: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
67a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
67b0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
67c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
67d0: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
67e0: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
67f0: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
6800: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
6810: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
6820: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
6830: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  low==0 );.  pPag
6840: 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
6850: 29 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20  )nByte;.  hdr = 
6860: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6870: 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74  ;..  nFrag = dat
6880: 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20  a[hdr+7];.  if( 
6890: 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20  nFrag<60 ){.    
68a0: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
68b0: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
68c0: 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e  or a slot big en
68d0: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
68e0: 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  the.    ** space
68f0: 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20   request. */.   
6900: 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20   addr = hdr+1;. 
6910: 20 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20     while( (pc = 
6920: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
6930: 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20  ddr]))>0 ){.    
6940: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
6950: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
6960: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d        if( size>=
6970: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
6980: 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20   int x = size - 
6990: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69  nByte;.        i
69a0: 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20  f( size<nByte+4 
69b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
69c0: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
69d0: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
69e0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
69f0: 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72  dr+7] = (u8)(nFr
6a00: 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20  ag + x);.       
6a10: 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a 20 20     return pc;.  
6a20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6a30: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
6a40: 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  &data[pc+2], x);
6a50: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
6a60: 6e 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20  n pc + x;.      
6a70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6a80: 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20    addr = pc;.   
6a90: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
6aa0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
6ab0: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
6ac0: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
6ad0: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
6ae0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
6af0: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
6b00: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
6b10: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
6b20: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
6b30: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
6b40: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
6b50: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
6b60: 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  set;.  if( nFrag
6b70: 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73  >=60 || cellOffs
6b80: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74  et + 2*nCell > t
6b90: 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20  op - nByte ){.  
6ba0: 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65    defragmentPage
6bb0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 74 6f 70  (pPage);.    top
6bc0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6bd0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20  a[hdr+5]);.  }. 
6be0: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
6bf0: 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66   assert( cellOff
6c00: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d  set + 2*nCell <=
6c10: 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79   top );.  put2by
6c20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
6c30: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
6c40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
6c50: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
6c60: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
6c70: 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn top;.}../*.
6c80: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
6c90: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
6ca0: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
6cb0: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
6cc0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
6cd0: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
6ce0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b   is pPage->aDisk
6cf0: 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  [start].** and t
6d00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
6d10: 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62  lock is "size" b
6d20: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74  ytes..**.** Most
6d30: 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68   of the effort h
6d40: 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  ere is involved 
6d50: 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a  in coalesing adj
6d60: 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c  acent.** free bl
6d70: 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ocks into a sing
6d80: 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63  le big free bloc
6d90: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
6da0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
6db0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73  ge *pPage, int s
6dc0: 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b  tart, int size){
6dd0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65  .  int addr, pbe
6de0: 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69  gin, hdr;.  unsi
6df0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
6e00: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
6e10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
6e20: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
6e30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
6e40: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
6e50: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
6e60: 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74  .  assert( start
6e70: 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  >=pPage->hdrOffs
6e80: 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61  et+6+(pPage->lea
6e90: 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65  f?0:4) );.  asse
6ea0: 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a  rt( (start + siz
6eb0: 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e)<=pPage->pBt->
6ec0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
6ed0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6ee0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6ef0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6f00: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e  .  assert( size>
6f10: 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =0 );   /* Minim
6f20: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
6f30: 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  4 */..#ifdef SQL
6f40: 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
6f50: 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65  E.  /* Overwrite
6f60: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
6f70: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
6f80: 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f  when the SECURE_
6f90: 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74  DELETE .  ** opt
6fa0: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61  ion is enabled a
6fb0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a  t compile-time *
6fc0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  /.  memset(&data
6fd0: 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  [start], 0, size
6fe0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
6ff0: 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61  Add the space ba
7000: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ck into the link
7010: 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  ed list of freeb
7020: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d  locks */.  hdr =
7030: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
7040: 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20  t;.  addr = hdr 
7050: 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  + 1;.  while( (p
7060: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
7070: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73  (&data[addr]))<s
7080: 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30  tart && pbegin>0
7090: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
70a0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
70b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
70c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67   );.    if( pbeg
70d0: 69 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20 20  in<=addr ) {.   
70e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
70f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7100: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
7110: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66  pbegin;.  }.  if
7120: 20 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65 2d   ( pbegin>pPage-
7130: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
7140: 2d 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -4 ) {.    retur
7150: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7160: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
7170: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
7180: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
7190: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
71a0: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
71b0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
71c0: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
71d0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
71e0: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
71f0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
7200: 72 65 65 20 2b 3d 20 28 75 31 36 29 73 69 7a 65  ree += (u16)size
7210: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
7220: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
7230: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
7240: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
7250: 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  et + 1;.  while(
7260: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
7270: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
7280: 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  )>0 ){.    int p
7290: 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a  next, psize, x;.
72a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
72b0: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
72c0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
72d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
72e0: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
72f0: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
7300: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
7310: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
7320: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
7330: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
7340: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
7350: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
7360: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
7370: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
7380: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
7390: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61  ;.      if( (fra
73a0: 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69  g<0) || (frag>(i
73b0: 6e 74 29 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  nt)data[pPage->h
73c0: 64 72 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b 0a  drOffset+7]) ){.
73d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
73e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
73f0: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
7400: 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64    data[pPage->hd
7410: 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28 75  rOffset+7] -= (u
7420: 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20  8)frag;.      x 
7430: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
7440: 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20  [pnext]);.      
7450: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
7460: 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20  begin], x);.    
7470: 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65    x = pnext + ge
7480: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
7490: 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b  xt+2]) - pbegin;
74a0: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
74b0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
74c0: 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   x);.    }else{.
74d0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65        addr = pbe
74e0: 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  gin;.    }.  }..
74f0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
7500: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65   content area be
7510: 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65  gins with a free
7520: 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74  block, remove it
7530: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b  . */.  if( data[
7540: 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+1]==data[hdr
7550: 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b  +5] && data[hdr+
7560: 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20  2]==data[hdr+6] 
7570: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a  ){.    int top;.
7580: 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74      pbegin = get
7590: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
75a0: 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1]);.    memcpy(
75b0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64  &data[hdr+1], &d
75c0: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b  ata[pbegin], 2);
75d0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
75e0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
75f0: 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  ) + get2byte(&da
7600: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
7610: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
7620: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
7630: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
7640: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
7650: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
7660: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
7670: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7680: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
7690: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
76a0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
76b0: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
76c0: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
76d0: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
76e0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
76f0: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
7700: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
7710: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
7720: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
7730: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
7740: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
7750: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
7760: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
7770: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
7780: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
7790: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
77a0: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
77b0: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
77c0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
77d0: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
77e0: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
77f0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
7800: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
7810: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
7820: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
7830: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
7840: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
7850: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
7860: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
7870: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
7880: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
7890: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
78a0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
78b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
78c0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
78d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
78e0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
78f0: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
7900: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
7910: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
7920: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
7930: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
7940: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
7950: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
7960: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
7970: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
7980: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
7990: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
79a0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
79b0: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70  ntKey = 1;.    p
79c0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
79d0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
79e0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
79f0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
7a00: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
7a10: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
7a20: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
7a30: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
7a40: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70  ERODATA ){.    p
7a50: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
7a60: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
7a70: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50  Data = 0;.    pP
7a80: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
7a90: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
7aa0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
7ab0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
7ac0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
7ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7ae0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
7af0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7b00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
7b10: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
7b20: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
7b30: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
7b40: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ock..**.** Retur
7b50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
7b60: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
7b70: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
7b80: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
7b90: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
7ba0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
7bb0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
7bc0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
7bd0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
7be0: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
7bf0: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
7c00: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
7c10: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
7c20: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
7c30: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
7c40: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
7c50: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
7c60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7c70: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65  BtreeInitPage(Me
7c80: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a  mPage *pPage){..
7c90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
7ca0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
7cb0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7cc0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7cd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7ce0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
7cf0: 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
7d00: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
7d10: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
7d20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d   assert( pPage =
7d30: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
7d40: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
7d50: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
7d60: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
7d70: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
7d80: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
7d90: 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66  DbPage) );..  if
7da0: 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
7db0: 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20   ){.    u16 pc; 
7dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7dd0: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
7de0: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
7df0: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
7e00: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
7e10: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
7e20: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
7e30: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
7e40: 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
7e50: 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f       /* Equal to
7e60: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
7e70: 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
7e80: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
7e90: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
7ea0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75 31  ucture */.    u1
7eb0: 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  6 usableSize;   
7ec0: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
7ed0: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
7ee0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75  ch page */.    u
7ef0: 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  16 cellOffset;  
7f00: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
7f10: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
7f20: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
7f30: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  nter */.    u16 
7f40: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
7f50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
7f60: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
7f70: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
7f80: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
7f90: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
7fa0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
7fb0: 20 61 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70 42   area */..    pB
7fc0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
7fd0: 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
7fe0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
7ff0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
8000: 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65  Data;.    if( de
8010: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
8020: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
8030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8040: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
8050: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
8060: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
8070: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
8080: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
8090: 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70  askPage = pBt->p
80a0: 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20  ageSize - 1;.   
80b0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
80c0: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
80d0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
80e0: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
80f0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
8100: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
8110: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
8120: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20  ->leaf;.    top 
8130: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8140: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50  [hdr+5]);.    pP
8150: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
8160: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8170: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
8180: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
8190: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
81a0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
81b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
81c0: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
81d0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
81e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
81f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8200: 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  T;.    }.  .    
8210: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
8220: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
8230: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
8240: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
8250: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
8260: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
8270: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20  [hdr+7] + top - 
8280: 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  (cellOffset + 2*
8290: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
82a0: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
82b0: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
82c0: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
82d0: 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d  ( pc>usableSize-
82e0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
82f0: 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66  Free block is of
8300: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
8310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8320: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8330: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
8340: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
8350: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
8360: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
8370: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
8380: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e  .      if( next>
8390: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
83a0: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20 20  ze+3 ){.        
83b0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
83c0: 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64  ust be in accend
83d0: 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
83e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
83f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8400: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
8410: 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20  nFree += size;. 
8420: 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a       pc = next;.
8430: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
8440: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 6e 46  >nFree = (u16)nF
8450: 72 65 65 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  ree;.    if( nFr
8460: 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ee>=usableSize )
8470: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
8480: 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63  space cannot exc
8490: 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73  eed total page s
84a0: 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ize */.      ret
84b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
84c0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
84d0: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63  .#if 0.  /* Chec
84e0: 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f  k that all the o
84f0: 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63 65  ffsets in the ce
8500: 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20  ll offset array 
8510: 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
8520: 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d  . .  ** .  ** Om
8530: 69 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73  itting this cons
8540: 69 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e  istency check an
8550: 64 20 75 73 69 6e 67 20 74 68 65 20 70 50 61 67  d using the pPag
8560: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b  e->maskPage mask
8570: 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  .  ** to prevent
8580: 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65   overrunning the
8590: 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e 20   page buffer in 
85a0: 66 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c  findCell() resul
85b0: 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35  ts in a.  ** 2.5
85c0: 25 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61  % performance ga
85d0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20  in..  */.  {.   
85e0: 20 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20   u8 *pOff;      
85f0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73    /* Iterator us
8600: 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20  ed to check all 
8610: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65  cell offsets are
8620: 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20   in range */.   
8630: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
8640: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8650: 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73  end of cell offs
8660: 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  et array */.    
8670: 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  u8 mask;        
8680: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
8690: 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65   that must be ze
86a0: 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c  ro in MSB of cel
86b0: 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20  l offsets */.   
86c0: 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28   mask = ~(((u8)(
86d0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
86e0: 29 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20  ))-1);.    pEnd 
86f0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
8700: 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c  et + pPage->nCel
8710: 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f  l*2];.    for(pO
8720: 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  ff=&data[cellOff
8730: 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64  set]; pOff!=pEnd
8740: 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61   && !((*pOff)&ma
8750: 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20  sk); pOff+=2);. 
8760: 20 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e     if( pOff!=pEn
8770: 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
8780: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
8790: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
87a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61  .#endif..    pPa
87b0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
87c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
87d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
87e0: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
87f0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
8800: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
8810: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
8820: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
8830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
8840: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
8850: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
8860: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
8870: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
8880: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
8890: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
88a0: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
88b0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
88c0: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
88d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
88e0: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
88f0: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
8900: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
8910: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8920: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8930: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
8940: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
8950: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
8960: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
8970: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
8980: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
8990: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
89a0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
89b0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
89c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
89d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
89e0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
89f0: 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61    /*memset(&data
8a00: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
8a10: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
8a20: 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20  ;*/.  data[hdr] 
8a30: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
8a40: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
8a50: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
8a60: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
8a70: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
8a80: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
8a90: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
8aa0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
8ab0: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
8ac0: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
8ad0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42  Page->nFree = pB
8ae0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
8af0: 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46  first;.  decodeF
8b00: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
8b10: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
8b20: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
8b30: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
8b40: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
8b50: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
8b60: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
8b70: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
8b80: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
8b90: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61  <=32768 );.  pPa
8ba0: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
8bb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
8bc0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
8bd0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
8be0: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
8bf0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
8c00: 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
8c10: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
8c20: 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
8c30: 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
8c40: 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
8c50: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
8c60: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
8c70: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
8c80: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
8c90: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
8ca0: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
8cb0: 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
8cc0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
8cd0: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
8ce0: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
8cf0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
8d00: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
8d10: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
8d20: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
8d30: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
8d40: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
8d50: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
8d60: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
8d70: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
8d80: 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
8d90: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
8da0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
8db0: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
8dc0: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
8dd0: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
8de0: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
8df0: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eded..**.** If t
8e00: 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
8e10: 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
8e20: 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
8e30: 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
8e40: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
8e50: 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
8e60: 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
8e70: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
8e80: 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
8e90: 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
8ea0: 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
8eb0: 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
8ec0: 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
8ed0: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
8ee0: 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
8ef0: 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
8f00: 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
8f10: 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
8f20: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
8f30: 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
8f40: 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
8f50: 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
8f60: 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
8f70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8f80: 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  BtreeGetPage(.  
8f90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
8fa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
8fb0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
8fc0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
8fd0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
8fe0: 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
8ff0: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
9000: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
9010: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
9020: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
9030: 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
9040: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f      /* Do not lo
9050: 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
9060: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
9070: 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
9080: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
9090: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
90a0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
90b0: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
90c0: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
90d0: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
90e0: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
90f0: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
9100: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
9110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
9120: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
9130: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
9140: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
9150: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9160: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
9170: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
9180: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
9190: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
91a0: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
91b0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
91c0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
91d0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
91e0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
91f0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
9200: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
9210: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
9220: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
9230: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
9240: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
9250: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
9260: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
9270: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9280: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
9290: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
92a0: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
92b0: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
92c0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
92d0: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
92e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
92f0: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
9300: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
9310: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
9320: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
9330: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
9340: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9350: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
9360: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
9370: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
9380: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
9390: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
93a0: 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61  tic Pgno pagerPa
93b0: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
93c0: 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50   *pBt){.  int nP
93d0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  age = -1;.  int 
93e0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rc;.  assert( pB
93f0: 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72  t->pPage1 );.  r
9400: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
9410: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
9420: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
9430: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
9440: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65  LITE_OK || nPage
9450: 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  ==-1 );.  return
9460: 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a   (Pgno)nPage;.}.
9470: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
9480: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
9490: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
94a0: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
94b0: 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63  e.** is just a c
94c0: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
94d0: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
94e0: 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  te calls to.** s
94f0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
9500: 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ge() and sqlite3
9510: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  BtreeInitPage().
9520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
9530: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
9540: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
9550: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9560: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
9570: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
9580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9590: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
95a0: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
95b0: 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f  e **ppPage     /
95c0: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
95d0: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
95e0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
95f0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
9600: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9610: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
9620: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
9630: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
9640: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9650: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
9660: 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f   }..  /* It is o
9670: 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74 68  ften the case th
9680: 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20 77  at the page we w
9690: 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  ant is already i
96a0: 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66  n cache..  ** If
96b0: 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65   so, get it dire
96c0: 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65  ctly.  This save
96d0: 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67  s us from having
96e0: 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61   to call.  ** pa
96f0: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74  gerPagecount() t
9700: 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f  o make sure pgno
9710: 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74   is within limit
9720: 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74 73  s, which results
9730: 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75  .  ** in a measu
9740: 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e  reable performan
9750: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e  ce improvements.
9760: 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 20  .  */.  *ppPage 
9770: 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  = pPage = btreeP
9780: 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 70  ageLookup(pBt, p
9790: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
97a0: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65  e ){.    /* Page
97b0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63   is already in c
97c0: 61 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ache */.    rc =
97d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
97e0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65  lse{.    /* Page
97f0: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20   not in cache.  
9800: 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20  Acquire it. */. 
9810: 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65     if( pgno>page
9820: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
9830: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9840: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9850: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
9860: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
9870: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
9880: 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
9890: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
98a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
98b0: 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d  e = *ppPage;.  }
98c0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
98d0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20  sInit ){.    rc 
98e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
98f0: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
9900: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
9910: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
9920: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
9930: 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  ;.    *ppPage = 
9940: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
9950: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
9960: 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
9970: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
9980: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
9990: 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
99a0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
99b0: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
99c0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
99d0: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
99e0: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
99f0: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
9a00: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
9a10: 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ow==0 || sqlite3
9a20: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
9a30: 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  t(pPage->pDbPage
9a40: 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  )>1 );.    asser
9a50: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
9a60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9a70: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
9a80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9a90: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
9aa0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
9ab0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
9ac0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
9ad0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
9ae0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
9af0: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
9b00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
9b10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9b20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9b30: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
9b40: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
9b50: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
9b60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
9b70: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
9b80: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
9b90: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
9ba0: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
9bb0: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
9bc0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
9bd0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
9be0: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
9bf0: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
9c00: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
9c10: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
9c20: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
9c30: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
9c40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
9c50: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
9c60: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
9c70: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
9c80: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
9c90: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
9ca0: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
9cb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
9cc0: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
9cd0: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
9ce0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
9cf0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
9d00: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
9d10: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66  tra(pData);.  if
9d20: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
9d30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
9d40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9d50: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9d60: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
9d70: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
9d80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
9d90: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
9da0: 70 44 61 74 61 29 3e 30 20 29 7b 0a 20 20 20 20  pData)>0 ){.    
9db0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
9dc0: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
9dd0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9de0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
9df0: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
9e00: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
9e10: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
9e20: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
9e30: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
9e40: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
9e50: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
9e60: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
9e70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9e80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
9e90: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
9ea0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
9eb0: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
9ec0: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
9ed0: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
9ee0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
9ef0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
9f00: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
9f10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
9f20: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
9f30: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
9f40: 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61  LL.** a new data
9f50: 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64  base with a rand
9f60: 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74  om name is creat
9f70: 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d  ed.  This random
9f80: 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61  ly named.** data
9f90: 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62  base file will b
9fa0: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73  e deleted when s
9fb0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
9fc0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
9fd0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
9fe0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
9ff0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
a000: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
a010: 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
a020: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
a030: 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
a040: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
a050: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
a060: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a070: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
a080: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
a090: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
a0a0: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
a0b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
a0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
a0d0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
a0e0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
a0f0: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
a100: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
a110: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
a120: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
a130: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a150: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
a160: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
a170: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
a180: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
a190: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
a1a0: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
a1b0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
a1c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
a1d0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
a1e0: 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61  btree */.  BtSha
a1f0: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
a200: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
a210: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
a220: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
a230: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
a240: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
a250: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
a260: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a270: 20 75 38 20 6e 52 65 73 65 72 76 65 3b 0a 20 20   u8 nReserve;.  
a280: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
a290: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20  bHeader[100];.. 
a2a0: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
a2b0: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
a2c0: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
a2d0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
a2e0: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
a2f0: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
a300: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
a310: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
a320: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
a330: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
a340: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
a350: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
a360: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
a370: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
a380: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
a390: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a3a0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
a3b0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
a3c0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
a3d0: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
a3e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
a3f0: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
a400: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
a410: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
a420: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
a430: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
a440: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
a450: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
a460: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
a470: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
a480: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a490: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
a4a0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66  mutex) );..  pVf
a4b0: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
a4c0: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
a4d0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
a4e0: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
a4f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a500: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
a510: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
a520: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
a530: 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65  b = db;..#if !de
a540: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a550: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
a560: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a570: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
a580: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
a590: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
a5a0: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
a5b0: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
a5c0: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
a5d0: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
a5e0: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
a5f0: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
a600: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
a610: 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c  =0.   && (db->fl
a620: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61  ags & SQLITE_Vta
a630: 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c  b)==0.   && zFil
a640: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
a650: 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69  me[0].  ){.    i
a660: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
a670: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
a680: 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
a690: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
a6a0: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
a6b0: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
a6c0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
a6d0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
a6e0: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
a6f0: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
a700: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
a710: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e  hared;.      p->
a720: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
a730: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
a740: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
a750: 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  che;.      if( !
a760: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
a770: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a780: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
a790: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a7a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
a7b0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75       sqlite3OsFu
a7c0: 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
a7d0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c   zFilename, nFul
a7e0: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
a7f0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
a800: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
a810: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
a820: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
a830: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
a840: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
a850: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
a860: 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  red);.      for(
a870: 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
a880: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
a890: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
a8a0: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
a8b0: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
a8c0: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
a8d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
a8e0: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
a8f0: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
a900: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
a910: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
a920: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
a930: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
a940: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
a950: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  s ){.          p
a960: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
a970: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
a980: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
a990: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a9a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a9b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a9c0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a9d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
a9e0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
a9f0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
aa00: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
aa10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
aa20: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
aa30: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
aa40: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
aa50: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
aa60: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
aa70: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
aa80: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
aa90: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
aaa0: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
aab0: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
aac0: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
aad0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
aae0: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
aaf0: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
ab00: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
ab10: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ab20: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
ab30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ab40: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
ab50: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
ab60: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
ab70: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
ab80: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
ab90: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
aba0: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
abb0: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
abc0: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
abd0: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
abe0: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
abf0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
ac00: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
ac10: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
ac20: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
ac30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
ac40: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
ac50: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
ac60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
ac70: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
ac80: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
ac90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
aca0: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
acb0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
acc0: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
acd0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
ace0: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
acf0: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
ad00: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
ad10: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
ad20: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
ad30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ad40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
ad50: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
ad60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
ad70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
ad80: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
ad90: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
ada0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
adb0: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
adc0: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
add0: 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  sFlags);.    if(
ade0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
adf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
ae00: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
ae10: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
ae20: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
ae30: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
ae40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ae50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ae60: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
ae70: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
ae80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
ae90: 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
aea0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
aeb0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
aec0: 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
aed0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
aee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
aef0: 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74  rSetReiniter(pBt
af00: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
af10: 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e  init);.    pBt->
af20: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
af30: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
af40: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
af50: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
af60: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
af70: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
af80: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67  Bt->pageSize = g
af90: 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64  et2byte(&zDbHead
afa0: 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  er[16]);.    if(
afb0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
afc0: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
afd0: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
afe0: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
aff0: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
b000: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
b010: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
b020: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
b030: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
b040: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
b050: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
b060: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
b070: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
b080: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b090: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
b0a0: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
b0b0: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
b0c0: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
b0d0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
b0e0: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
b0f0: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
b100: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
b110: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
b120: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
b130: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
b140: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
b150: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
b160: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
b170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
b180: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
b190: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
b1a0: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
b1b0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
b1c0: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
b1d0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
b1e0: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
b1f0: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
b200: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b210: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
b220: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
b230: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
b240: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
b250: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
b260: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
b270: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
b280: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
b290: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
b2a0: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
b2b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b2c0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
b2d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b2e0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
b2f0: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
b300: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
b310: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
b320: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b330: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
b340: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
b350: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
b360: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
b370: 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
b380: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
b390: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
b3a0: 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
b3b0: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
b3c0: 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  }.    pBt->usabl
b3d0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
b3e0: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
b3f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
b400: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
b410: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
b420: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
b430: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20  pageSize */.    
b440: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
b450: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
b460: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
b470: 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64  ize);.   .#if !d
b480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b490: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
b4a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
b4b0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
b4c0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
b4d0: 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
b4e0: 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
b4f0: 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
b500: 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
b510: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
b520: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  rable ){.      s
b530: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
b540: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
b550: 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
b560: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
b570: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
b580: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
b590: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
b5a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
b5b0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
b5c0: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
b5d0: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
b5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
b5f0: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
b600: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
b610: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
b620: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
b630: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
b640: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b650: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
b660: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
b670: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
b680: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
b690: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
b6a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b6b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
b6c0: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
b6d0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
b6e0: 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
b6f0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
b700: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
b710: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
b720: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
b730: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
b740: 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
b750: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
b760: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
b770: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
b780: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b790: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
b7a0: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
b7b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
b7c0: 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
b7d0: 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
b7e0: 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
b7f0: 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
b800: 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
b810: 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
b820: 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
b830: 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
b840: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
b850: 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
b860: 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
b870: 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
b880: 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
b890: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
b8a0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
b8b0: 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
b8c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b8d0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
b8e0: 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
b8f0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
b900: 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
b910: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
b920: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
b930: 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
b940: 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
b950: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
b960: 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
b970: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
b980: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
b990: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
b9a0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
b9b0: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
b9c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b9d0: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
b9e0: 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
b9f0: 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
ba00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ba10: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
ba20: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
ba30: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
ba40: 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
ba50: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
ba60: 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
ba70: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
ba80: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
ba90: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
baa0: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
bab0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
bac0: 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
bad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
baf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bb00: 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
bb10: 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
bb20: 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
bb30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
bb40: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
bb50: 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
bb60: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
bb70: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
bb80: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
bb90: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
bba0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
bbb0: 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
bbc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
bbd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
bbe0: 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
bbf0: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
bc00: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
bc10: 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
bc20: 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
bc30: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
bc40: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
bc50: 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
bc60: 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
bc70: 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
bc80: 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
bc90: 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
bca0: 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
bcb0: 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
bcc0: 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
bcd0: 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
bce0: 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
bcf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
bd00: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71  HARED_CACHE.  sq
bd10: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
bd20: 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64  ster;.  BtShared
bd30: 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
bd40: 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
bd50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
bd60: 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
bd70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d  ->mutex) );.  pM
bd80: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
bd90: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
bda0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
bdb0: 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33  STER);.  sqlite3
bdc0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
bdd0: 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
bde0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
bdf0: 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
be00: 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
be10: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
be20: 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
be30: 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
be40: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
be50: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
be60: 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
be70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
be80: 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
be90: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
bea0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
beb0: 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
bec0: 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
bed0: 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
bee0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
bef0: 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
bf00: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
bf10: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
bf20: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
bf30: 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
bf40: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
bf50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
bf60: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
bf70: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
bf80: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
bf90: 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
bfa0: 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
bfb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
bfc0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
bfd0: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
bfe0: 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
bff0: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
c000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
c010: 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
c020: 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
c030: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
c040: 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
c050: 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  Bt) bytes..*/.st
c060: 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
c070: 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
c080: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
c090: 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
c0a0: 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
c0b0: 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
c0c0: 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
c0d0: 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
c0e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
c0f0: 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
c100: 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
c110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
c120: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
c130: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
c140: 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42  ite3PageFree( pB
c150: 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
c160: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
c170: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
c180: 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
c190: 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
c1a0: 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
c1b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
c1c0: 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
c1d0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
c1e0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
c1f0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
c200: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
c210: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
c220: 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
c230: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
c240: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c250: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
c260: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
c270: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
c280: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
c290: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
c2a0: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
c2b0: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
c2c0: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
c2d0: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
c2e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
c2f0: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
c300: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c310: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
c320: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
c330: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
c340: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
c350: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
c360: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
c370: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
c380: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c390: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
c3a0: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
c3b0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
c3c0: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
c3d0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
c3e0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
c3f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c400: 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
c410: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
c420: 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
c430: 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
c440: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
c450: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
c460: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
c470: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
c480: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
c490: 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
c4a0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
c4b0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
c4c0: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
c4d0: 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
c4e0: 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
c4f0: 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
c500: 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
c510: 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
c520: 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
c530: 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
c540: 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
c550: 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
c560: 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
c570: 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
c580: 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
c590: 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
c5a0: 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
c5b0: 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
c5c0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
c5d0: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
c5e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
c5f0: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
c600: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
c610: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
c620: 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
c630: 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
c640: 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
c650: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
c660: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
c670: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
c680: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
c690: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
c6a0: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
c6b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c6c0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
c6d0: 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
c6e0: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
c6f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
c700: 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
c710: 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
c720: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
c730: 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
c740: 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
c750: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
c760: 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
c770: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
c780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c790: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
c7a0: 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
c7b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
c7c0: 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
c7d0: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
c7e0: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
c7f0: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
c800: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
c810: 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
c820: 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
c830: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
c840: 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
c850: 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
c860: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
c870: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
c880: 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
c890: 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
c8a0: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
c8b0: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
c8c0: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
c8d0: 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
c8e0: 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
c8f0: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
c900: 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
c910: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
c920: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
c930: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
c940: 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
c950: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
c960: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
c970: 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
c980: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
c990: 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
c9a0: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
c9b0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
c9c0: 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
c9d0: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
c9e0: 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
c9f0: 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
ca00: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
ca10: 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
ca20: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
ca30: 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
ca40: 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
ca50: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ca60: 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
ca70: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
ca80: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
ca90: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
caa0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cab0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
cac0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
cad0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
cae0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
caf0: 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
cb00: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
cb10: 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
cb20: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
cb30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cb40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
cb50: 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
cb60: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
cb70: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
cb80: 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
cb90: 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
cba0: 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
cbb0: 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
cbc0: 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
cbd0: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
cbe0: 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
cbf0: 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
cc00: 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
cc10: 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
cc20: 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
cc30: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
cc40: 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
cc50: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
cc60: 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
cc70: 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
cc80: 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
cc90: 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
cca0: 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
ccb0: 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
ccc0: 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
ccd0: 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
cce0: 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
ccf0: 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
cd00: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
cd10: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
cd20: 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
cd30: 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
cd40: 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
cd50: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
cd60: 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
cd70: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
cd80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cd90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
cda0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
cdb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
cdc0: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
cdd0: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
cde0: 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
cdf0: 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
ce00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
ce10: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
ce20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ce30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
ce40: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
ce50: 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
ce60: 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
ce70: 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
ce80: 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
ce90: 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
cea0: 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
ceb0: 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
cec0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
ced0: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
cee0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
cef0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
cf00: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
cf10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cf20: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
cf30: 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
cf40: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
cf50: 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
cf60: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
cf70: 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
cf80: 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
cf90: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
cfa0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
cfb0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
cfc0: 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
cfd0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
cfe0: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
cff0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d000: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
d010: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
d020: 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
d030: 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
d040: 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
d050: 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a  es per page..**.
d060: 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
d070: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
d080: 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
d090: 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
d0a0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
d0b0: 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
d0c0: 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
d0d0: 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
d0e0: 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
d0f0: 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
d100: 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
d110: 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
d120: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
d130: 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
d140: 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
d150: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d160: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
d170: 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
d180: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
d190: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
d1a0: 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
d1b0: 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
d1c0: 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
d1d0: 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
d1e0: 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
d1f0: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
d200: 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
d210: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
d220: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
d230: 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
d240: 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
d250: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
d260: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
d270: 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
d280: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
d290: 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
d2a0: 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
d2b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
d2c0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
d2d0: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
d2e0: 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
d2f0: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
d300: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
d310: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
d320: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
d330: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
d340: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
d350: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d360: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
d370: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
d380: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
d390: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
d3a0: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
d3b0: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
d3c0: 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
d3d0: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
d3e0: 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
d3f0: 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
d400: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
d410: 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
d420: 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
d430: 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
d440: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
d450: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
d460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
d470: 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
d480: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
d490: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
d4a0: 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
d4b0: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
d4c0: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  ce(pBt);.    rc 
d4d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
d4e0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
d4f0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
d500: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
d510: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
d520: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
d530: 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
d540: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
d550: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
d560: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
d570: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
d580: 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
d590: 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
d5a0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
d5b0: 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
d5c0: 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
d5d0: 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73  ageSize;.}.int s
d5e0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
d5f0: 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
d600: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
d610: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
d620: 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
d630: 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
d640: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
d650: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
d660: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
d670: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
d680: 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
d690: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
d6a0: 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
d6b0: 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
d6c0: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
d6d0: 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
d6e0: 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
d6f0: 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
d700: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
d710: 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
d720: 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
d730: 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
d740: 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
d750: 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
d760: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
d770: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
d780: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
d790: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
d7a0: 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
d7b0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
d7c0: 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
d7d0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
d7e0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69  eturn n;.}.#endi
d7f0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
d800: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
d810: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
d820: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d830: 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
d840: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
d850: 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
d860: 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
d870: 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
d880: 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
d890: 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
d8a0: 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
d8b0: 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
d8c0: 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
d8d0: 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
d8e0: 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
d8f0: 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
d900: 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
d910: 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
d920: 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
d930: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
d940: 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
d950: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
d960: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
d970: 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
d980: 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
d990: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
d9a0: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
d9b0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
d9c0: 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
d9d0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
d9e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d9f0: 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
da00: 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
da10: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
da20: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
da30: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
da40: 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
da50: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
da60: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
da70: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
da80: 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
da90: 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
daa0: 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
dab0: 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
dac0: 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
dad0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
dae0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
daf0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
db00: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
db10: 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
db20: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
db30: 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
db40: 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
db50: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
db60: 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
db70: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
db80: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
db90: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
dba0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
dbb0: 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
dbc0: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
dbd0: 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
dbe0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
dbf0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
dc00: 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
dc10: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
dc20: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
dc30: 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
dc40: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
dc50: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
dc60: 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
dc70: 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
dc80: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
dc90: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
dca0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
dcb0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
dcc0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
dcd0: 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
dce0: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
dcf0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
dd00: 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
dd10: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
dd20: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
dd30: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
dd40: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
dd50: 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
dd60: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
dd70: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
dd80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
dd90: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
dda0: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
ddb0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
ddc0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
ddd0: 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
dde0: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
ddf0: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
de00: 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
de10: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
de20: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
de30: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
de40: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
de50: 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73  int nPage;..  as
de60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
de70: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
de80: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
de90: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
dea0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
deb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
dec0: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
ded0: 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
dee0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
def0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
df00: 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
df10: 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
df20: 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
df30: 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
df40: 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
df50: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
df60: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
df70: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
df80: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
df90: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
dfa0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dfb0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
dfc0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73  t_failed;.  }els
dfd0: 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b  e if( nPage>0 ){
dfe0: 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a  .    int pageSiz
dff0: 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  e;.    int usabl
e000: 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
e010: 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
e020: 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
e030: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
e040: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
e050: 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
e060: 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
e070: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
e080: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
e090: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
e0a0: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
e0b0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
e0c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
e0d0: 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
e0e0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
e0f0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
e100: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
e110: 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
e120: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
e130: 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
e140: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
e150: 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
e160: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
e170: 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
e180: 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
e190: 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
e1a0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
e1b0: 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
e1c0: 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
e1d0: 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
e1e0: 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
e1f0: 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
e200: 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
e210: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e220: 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
e230: 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
e240: 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
e250: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
e260: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
e270: 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65     pageSize = ge
e280: 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36  t2byte(&page1[16
e290: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  ]);.    if( ((pa
e2a0: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
e2b0: 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69  ze)!=0 || pageSi
e2c0: 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20  ze<512 ||.      
e2d0: 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41    (SQLITE_MAX_PA
e2e0: 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26  GE_SIZE<32768 &&
e2f0: 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
e300: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a  _MAX_PAGE_SIZE).
e310: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
e320: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
e330: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
e340: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
e350: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
e360: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
e370: 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
e380: 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  ];.    if( pageS
e390: 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
e3a0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
e3b0: 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
e3c0: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
e3d0: 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
e3e0: 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
e3f0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
e400: 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
e410: 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
e420: 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
e430: 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
e440: 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
e450: 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
e460: 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
e470: 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
e480: 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
e490: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e4a0: 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
e4b0: 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
e4c0: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
e4d0: 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
e4e0: 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
e4f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e500: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
e510: 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
e520: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31  usableSize = (u1
e530: 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  6)usableSize;.  
e540: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
e550: 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
e560: 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
e570: 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
e580: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
e590: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
e5a0: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
e5b0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  geSize);.      r
e5c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e5d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
e5e0: 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b  sableSize<500 ){
e5f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
e600: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
e610: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
e620: 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
e630: 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
e640: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
e650: 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23  16)usableSize;.#
e660: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e670: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
e680: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
e690: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
e6a0: 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
e6b0: 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
e6c0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
e6d0: 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
e6e0: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
e6f0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
e700: 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
e710: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
e720: 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
e730: 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
e740: 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
e750: 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
e760: 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
e770: 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
e780: 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
e790: 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
e7a0: 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
e7b0: 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
e7c0: 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
e7d0: 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
e7e0: 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
e7f0: 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
e800: 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
e810: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
e820: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
e830: 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
e840: 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
e850: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
e860: 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
e870: 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
e880: 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
e890: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
e8a0: 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
e8b0: 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
e8c0: 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ner, a header wh
e8d0: 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
e8e0: 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
e8f0: 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
e900: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
e910: 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
e920: 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
e930: 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
e940: 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
e950: 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  xLocal = (pBt->u
e960: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
e970: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
e980: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42  ->minLocal = (pB
e990: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
e9a0: 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20  )*32/255 - 23;. 
e9b0: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
e9c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
e9d0: 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e  - 35;.  pBt->min
e9e0: 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61  Leaf = (pBt->usa
e9f0: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
ea00: 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65 72  55 - 23;.  asser
ea10: 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
ea20: 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
ea30: 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
ea40: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
ea50: 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ge1;.  return SQ
ea60: 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
ea70: 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
ea80: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
ea90: 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
eaa0: 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
eab0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
eac0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
ead0: 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  like lockBtree()
eae0: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
eaf0: 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65  also invokes the
eb00: 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63  .** busy callbac
eb10: 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f  k if there is lo
eb20: 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a  ck contention..*
eb30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
eb40: 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28  kBtreeWithRetry(
eb50: 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20  Btree *pRef){.  
eb60: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
eb70: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
eb80: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
eb90: 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b 0a 20  Mutex(pRef) );. 
eba0: 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61   if( pRef->inTra
ebb0: 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
ebc0: 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73  {.    u8 inTrans
ebd0: 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70  action = pRef->p
ebe0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
ebf0: 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65  n;.    btreeInte
ec00: 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20  grity(pRef);.   
ec10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
ec20: 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65  eeBeginTrans(pRe
ec30: 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d  f, 0);.    pRef-
ec40: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
ec50: 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74  ion = inTransact
ec60: 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69  ion;.    pRef->i
ec70: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
ec80: 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ONE;.    if( rc=
ec90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
eca0: 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e      pRef->pBt->n
ecb0: 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
ecc0: 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e     }.    btreeIn
ecd0: 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
ece0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
ecf0: 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  }.       ../*.**
ed00: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
ed10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
ed20: 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
ed30: 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
ed40: 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
ed50: 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
ed60: 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
ed70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
ed80: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
ed90: 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
eda0: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
edb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
edc0: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
edd0: 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
ede0: 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
edf0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
ee00: 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73  ere are any outs
ee10: 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c  tanding cursors,
ee20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ee30: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
ee40: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
ee50: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
ee60: 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
ee70: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
ee80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
ee90: 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
eea0: 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
eeb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
eec0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
eed0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
eee0: 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
eef0: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
ef00: 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72  ONE && pBt->pCur
ef10: 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70  sor==0 && pBt->p
ef20: 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
ef30: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
ef40: 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
ef50: 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20  ager)>=1 ){.    
ef60: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
ef70: 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
ef80: 23 69 66 20 30 0a 20 20 20 20 20 20 69 66 28 20  #if 0.      if( 
ef90: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
efa0: 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
efb0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
efc0: 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
efd0: 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44         pPage->aD
efe0: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
eff0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
f000: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
f010: 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
f020: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61  pBt;.        pPa
f030: 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ge->pgno = 1;.  
f040: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
f050: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
f060: 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt->pPage1);.   
f070: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67   }.    pBt->pPag
f080: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
f090: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
f0a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
f0b0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
f0c0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
f0d0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
f0e0: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  f the.** file..*
f0f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
f100: 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
f110: 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
f120: 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
f130: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
f140: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
f150: 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  nPage;..  assert
f160: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f170: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
f180: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
f190: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
f1a0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
f1b0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
f1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50  =SQLITE_OK || nP
f1d0: 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
f1e0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
f1f0: 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
f200: 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
f210: 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
f220: 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
f230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
f240: 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
f250: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
f260: 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
f270: 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
f280: 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
f290: 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
f2a0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
f2b0: 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
f2c0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
f2d0: 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67  ta[16], pBt->pag
f2e0: 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31  eSize);.  data[1
f2f0: 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
f300: 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
f310: 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
f320: 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
f330: 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
f340: 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
f350: 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
f360: 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
f370: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
f380: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
f390: 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
f3a0: 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
f3b0: 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
f3c0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
f3d0: 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
f3e0: 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
f3f0: 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
f400: 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
f410: 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53   );.  pBt->pageS
f420: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
f430: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f440: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
f450: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
f460: 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
f470: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
f480: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
f490: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
f4a0: 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
f4b0: 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
f4c0: 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
f4d0: 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
f4e0: 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
f4f0: 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
f500: 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
f510: 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  um);.#endif.  re
f520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f530: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
f540: 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
f550: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
f560: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
f570: 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
f580: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
f590: 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
f5a0: 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
f5b0: 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
f5c0: 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
f5d0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
f5e0: 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
f5f0: 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
f600: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
f610: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
f620: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
f630: 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
f640: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
f650: 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
f660: 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
f670: 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
f680: 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
f690: 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
f6a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
f6b0: 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
f6c0: 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
f6d0: 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
f6e0: 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
f6f0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
f700: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
f710: 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
f720: 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
f730: 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
f740: 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
f750: 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
f760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
f770: 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
f780: 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
f790: 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
f7a0: 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
f7b0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f7c0: 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
f7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
f7e0: 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
f7f0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
f800: 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
f810: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
f820: 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
f830: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
f840: 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
f850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
f860: 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
f870: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
f880: 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
f890: 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
f8a0: 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
f8b0: 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
f8c0: 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
f8d0: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
f8e0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
f8f0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
f900: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
f910: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
f920: 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
f930: 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
f940: 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
f950: 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
f960: 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
f970: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
f980: 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
f990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
f9a0: 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
f9b0: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
f9c0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
f9d0: 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
f9e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
f9f0: 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
fa00: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
fa10: 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
fa20: 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
fa30: 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
fa40: 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
fa50: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
fa60: 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
fa70: 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
fa80: 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
fa90: 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
faa0: 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
fab0: 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
fac0: 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
fad0: 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
fae0: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
faf0: 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
fb00: 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
fb10: 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
fb20: 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
fb30: 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
fb40: 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
fb50: 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
fb60: 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
fb70: 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
fb80: 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
fb90: 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
fba0: 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
fbb0: 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
fbc0: 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
fbd0: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
fbe0: 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
fbf0: 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42  int wrflag){.  B
fc00: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
fc10: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
fc20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
fc30: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
fc40: 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
fc50: 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65  = p->db;.  btree
fc60: 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
fc70: 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
fc80: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
fc90: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
fca0: 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
fcb0: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
fcc0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
fcd0: 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
fce0: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
fcf0: 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
fd00: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
fd10: 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
fd20: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
fd30: 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
fd40: 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
fd50: 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
fd60: 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
fd70: 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  }..  /* Write tr
fd80: 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
fd90: 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
fda0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
fdb0: 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ase */.  if( pBt
fdc0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72  ->readOnly && wr
fdd0: 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
fde0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
fdf0: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
fe00: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
fe10: 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
fe20: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
fe30: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
fe40: 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
fe50: 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
fe60: 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
fe70: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
fe80: 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
fe90: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
fea0: 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
feb0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
fec0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   */.  if( pBt->i
fed0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
fee0: 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72 66  ANS_WRITE && wrf
fef0: 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
ff00: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
ff10: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
ff20: 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
ff30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
ff40: 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77  ED_CACHE.  if( w
ff50: 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
ff60: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
ff70: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
ff80: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
ff90: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
ffa0: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
ffb0: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
ffc0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
ffd0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
ffe0: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
fff0: 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  egun;.      }.  
10000 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
10010 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70    do {.    if( p
10020 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b  Bt->pPage1==0 ){
10030 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
10040 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
10050 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 77  e(pBt);.      }w
10060 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
10070 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  1==0 && rc==SQLI
10080 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a  TE_OK );.    }..
10090 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
100a0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
100b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  ){.      if( pBt
100c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
100d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
100e0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
100f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10100 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10110 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
10120 67 65 72 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a  ger, wrflag>1);.
10130 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
10140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10150 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
10160 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
10170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10180 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
10190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
101a0 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  {.      if( wrfl
101b0 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ag ) pBt->inStmt
101c0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
101d0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
101e0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
101f0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
10200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
10210 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
10220 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
10230 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
10240 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
10250 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
10260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10270 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
10280 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
10290 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
102a0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
102b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ++;.    }.    p-
102c0 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
102d0 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
102e0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
102f0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
10300 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10310 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
10320 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10330 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
10340 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
10350 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
10360 48 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61  HE.    if( wrfla
10370 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73  g>1 ){.      ass
10380 65 72 74 28 20 21 70 42 74 2d 3e 70 45 78 63 6c  ert( !pBt->pExcl
10390 75 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20 70  usive );.      p
103a0 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d  Bt->pExclusive =
103b0 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   p;.    }.#endif
103c0 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
103d0 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
103e0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
103f0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
10400 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
10410 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
10420 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
10430 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
10440 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
10450 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
10460 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
10470 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
10480 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
10490 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
104a0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
104b0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
104c0 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
104d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
104e0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
104f0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
10500 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
10510 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
10520 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
10530 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10540 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10550 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
10560 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10570 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
10580 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
10590 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
105a0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
105b0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
105c0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
105d0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
105e0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
105f0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
10600 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
10610 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
10620 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
10630 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
10640 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
10650 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
10660 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
10690 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
106a0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
106d0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
106e0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
106f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10710 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10720 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10730 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
10740 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
10750 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
10760 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
10770 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
10780 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10790 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
107a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
107b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
107c0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
107d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
107e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
107f0 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
10800 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
10810 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
10820 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
10830 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
10840 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
10850 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
10860 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   i);..    rc = p
10870 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
10880 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
10890 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
108a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
108b0 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
108c0 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
108d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
108e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
108f0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
10900 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
10910 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
10920 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
10930 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
10940 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  EE, pgno);.     
10950 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10960 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68  OK ) goto set_ch
10970 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
10980 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
10990 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
109a0 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
109b0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
109c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
109d0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
109e0 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72  ]);.    rc = ptr
109f0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
10a00 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
10a10 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  REE, pgno);.  }.
10a20 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
10a30 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
10a40 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
10a50 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
10a60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
10a70 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20  where on pPage, 
10a80 77 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74  which is guarent
10a90 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65  eed to be a btre
10aa0 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f  e page, not an o
10ab0 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c  verflow.** page,
10ac0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
10ad0 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64   page iFrom. Mod
10ae0 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
10af0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
10b00 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61  ts to.** iTo. Pa
10b10 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
10b20 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
10b30 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62   of pointer to b
10b40 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a  e modified, as .
10b50 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  ** follows:.**.*
10b60 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
10b70 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
10b80 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
10b90 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
10ba0 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10bc0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
10bd0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
10be0 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
10bf0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
10c00 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
10c10 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
10c20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10c30 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
10c40 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
10c50 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
10c60 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
10c70 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
10c80 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
10c90 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
10ca0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
10cb0 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
10cc0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
10cd0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
10ce0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
10cf0 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
10d00 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
10d10 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
10d20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
10d30 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
10d40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10d50 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
10d60 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
10d70 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
10d80 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
10d90 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
10da0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
10db0 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
10dc0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
10dd0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
10de0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
10df0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
10e00 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
10e10 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
10e20 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
10e30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10e40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10e50 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
10e60 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
10e70 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
10e80 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
10e90 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
10ea0 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
10eb0 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
10ec0 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  l;..    sqlite3B
10ed0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
10ee0 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ge);.    nCell =
10ef0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
10f00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
10f10 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
10f20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
10f30 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
10f40 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
10f50 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
10f60 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
10f70 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
10f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10f90 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
10fa0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
10fb0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
10fc0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
10fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
10fe0 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
10ff0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
11000 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20  erflow]) ){.    
11010 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
11020 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
11030 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
11040 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11050 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
11070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
11080 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
11090 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
110a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
110b0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
110c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
110d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
110e0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
110f0 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
11100 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
11110 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
11120 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
11130 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
11140 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
11150 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
11160 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11170 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
11190 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
111a0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
111b0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
111c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
111d0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
111e0 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
111f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11200 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
11210 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
11220 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
11230 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
11240 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
11250 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
11260 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
11270 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f  emains valid..*/
11280 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
11290 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
112a0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
112b0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
112c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
112d0 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
112e0 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
112f0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11310 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
11320 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
11330 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
11340 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
11350 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
11360 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
11370 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
11380 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
11390 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
113a0 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
113b0 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
113c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
113d0 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  it.){.  MemPage 
113e0 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
113f0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
11400 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
11410 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
11420 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
11430 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
11440 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
11450 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
11460 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
11470 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
11480 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
11490 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
114a0 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
114b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
114c0 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
114d0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
114e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
114f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11500 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11510 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
11520 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
11530 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
11540 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
11550 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
11560 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
11570 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
11580 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
11590 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
115a0 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
115b0 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
115c0 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
115d0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
115e0 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
115f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11600 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
11610 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
11620 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
11630 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
11640 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11650 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
11660 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
11670 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
11680 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
11690 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
116a0 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
116b0 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
116c0 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
116d0 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
116e0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
116f0 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
11700 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
11710 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
11720 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
11730 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
11740 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
11750 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
11760 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
11770 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
11780 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
11790 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
117a0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
117b0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
117c0 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
117d0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
117e0 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
117f0 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
11800 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
11810 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
11820 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
11830 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
11840 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
11850 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
11860 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
11870 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
11880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11890 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
118a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
118b0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
118c0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
118d0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
118e0 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
118f0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
11900 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
11910 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
11920 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
11930 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
11940 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11950 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11960 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
11970 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
11980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
11990 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
119a0 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
119b0 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
119c0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
119d0 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
119e0 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
119f0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
11a00 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
11a10 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
11a20 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
11a30 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
11a40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11a50 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
11a60 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
11a70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
11a80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11a90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11aa0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
11ab0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
11ac0 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
11ad0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
11ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11af0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11b00 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
11b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11b20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
11b30 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
11b40 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
11b50 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
11b60 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
11b70 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
11b80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11b90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
11ba0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
11bb0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
11bc0 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20  e, iPtrPage);.  
11bd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11be0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
11bf0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
11c00 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
11c10 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
11c20 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
11c30 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
11c40 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
11c50 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
11c60 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
11c70 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
11c80 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
11c90 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
11ca0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
11cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11cc0 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
11cd0 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
11ce0 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
11cf0 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
11d00 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
11d10 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
11d20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
11d30 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
11d40 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
11d50 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
11d60 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
11d70 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
11d80 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
11d90 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
11da0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
11db0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
11dc0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
11dd0 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
11de0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
11df0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
11e00 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61  n assumes.** tha
11e10 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  t the caller wil
11e20 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
11e30 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
11e40 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75  until.** it retu
11e50 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
11e60 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  or an error, and
11e70 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68   that nFin is th
11e80 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70  e.** number of p
11e90 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ages the databas
11ea0 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74  e file will cont
11eb0 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a  ain after this .
11ec0 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f  ** process is co
11ed0 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  mplete..*/.stati
11ee0 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
11ef0 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
11f00 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
11f10 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20  gno iLastPg){.  
11f20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
11f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11f40 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
11f50 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
11f60 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
11f70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11f80 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11f90 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
11fa0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
11fb0 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
11fc0 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
11fd0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
11fe0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38    int rc;.    u8
11ff0 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
12000 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
12010 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
12020 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
12030 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
12040 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
12050 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61  ==0 || nFin==iLa
12060 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65  stPg ){.      re
12070 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
12080 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
12090 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
120a0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
120b0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
120c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
120d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
120e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
120f0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
12100 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
12110 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12120 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12130 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
12140 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
12150 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
12160 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
12170 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
12180 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
12190 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
121a0 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
121b0 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
121c0 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20    ** if nFin is 
121d0 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
121e0 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
121f0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
12200 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
12210 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
12220 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
12230 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
12240 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
12250 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
12260 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
12270 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
12280 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
12290 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
122a0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
122b0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
122c0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
122d0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
122e0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
122f0 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
12300 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
12310 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12320 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12330 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
12340 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12350 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
12360 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
12370 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
12380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
12390 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
123a0 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
123b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
123c0 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
123d0 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
123e0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
123f0 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20   *pLastPg;..    
12400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12410 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
12420 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
12430 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
12440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12450 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
12460 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
12470 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69      /* If nFin i
12480 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
12490 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
124a0 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
124b0 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
124c0 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
124d0 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
124e0 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
124f0 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
12500 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
12510 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
12520 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61   if nFin is grea
12530 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
12540 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
12550 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
12560 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
12570 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
12580 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
12590 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
125a0 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
125b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f       */.      do
125c0 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
125d0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
125e0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
125f0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
12600 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
12610 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ePg, 0, 0);.    
12620 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12640 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
12650 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
12660 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12680 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
12690 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
126a0 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69  le( nFin!=0 && i
126b0 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
126c0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
126d0 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
126e0 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
126f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
12700 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62  ite(pLastPg->pDb
12710 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
12720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12730 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
12740 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
12750 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
12760 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
12770 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20  Pg, nFin!=0);.  
12780 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
12790 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
127a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
127b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
127c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
127d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
127e0 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30  }..  if( nFin==0
127f0 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d   ){.    iLastPg-
12800 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  -;.    while( iL
12810 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
12820 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
12830 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
12840 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
12850 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
12860 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12870 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
12880 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
12890 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20  iLastPg);.  }.  
128a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
128b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
128c0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
128d0 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
128e0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
128f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
12900 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
12910 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
12920 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
12930 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
12940 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
12950 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
12960 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
12970 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
12980 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
12990 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
129a0 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
129b0 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
129c0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  no error occured
129d0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
129e0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
129f0 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
12a00 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
12a10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12a20 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
12a30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
12a40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12a50 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
12a60 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12a70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
12a80 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
12a90 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12aa0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
12ab0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
12ac0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
12ad0 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
12ae0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
12af0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
12b00 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c  }else{.    inval
12b10 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
12b20 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
12b30 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
12b40 74 65 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65  tep(pBt, 0, page
12b50 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29  rPagecount(pBt))
12b60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
12b70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12b80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12b90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12ba0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
12bb0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
12bc0 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
12bd0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
12be0 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
12bf0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
12c00 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
12c10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
12c20 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
12c30 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
12c40 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
12c50 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
12c60 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
12c70 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
12c80 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
12c90 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
12ca0 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
12cb0 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
12cc0 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
12cd0 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
12ce0 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
12cf0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
12d00 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
12d10 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
12d20 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
12d30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12d40 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
12d50 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
12d60 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
12d70 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
12d80 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
12d90 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   );..  assert( s
12da0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12db0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
12dc0 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
12dd0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
12de0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
12df0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
12e00 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
12e10 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
12e20 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f  o nFin;.    Pgno
12e30 20 6e 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f   nFree;.    Pgno
12e40 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67   nPtrmap;.    Pg
12e50 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f  no iFree;.    co
12e60 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  nst int pgsz = p
12e70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  Bt->pageSize;.  
12e80 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70    Pgno nOrig = p
12e90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
12ea0 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52  t);..    if( PTR
12eb0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
12ec0 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20  nOrig) ){.      
12ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12ee0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
12ef0 7d 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d  }.    if( nOrig=
12f00 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
12f10 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
12f20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 7d 0a   nOrig--;.    }.
12f30 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
12f40 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
12f50 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
12f60 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
12f70 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
12f80 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
12f90 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73  ig)+pgsz/5)/(pgs
12fa0 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  z/5);.    nFin =
12fb0 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
12fc0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
12fd0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
12fe0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
12ff0 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f  & nFin<=PENDING_
13000 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
13010 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
13020 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
13030 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
13040 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
13050 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
13060 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
13070 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
13080 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
13090 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
130a0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
130b0 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
130c0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
130d0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
130e0 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
130f0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
13100 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
13110 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
13120 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
13130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13140 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13150 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
13160 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
13170 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
13180 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
13190 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
131a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
131b0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
131c0 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
131d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
131e0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
131f0 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
13200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
13210 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13220 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
13230 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
13240 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13250 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
13260 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
13270 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
13280 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
13290 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53  ndif /* ifndef S
132a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
132b0 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
132c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
132d0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
132e0 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
132f0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
13300 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
13310 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
13320 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
13330 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
13340 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
13350 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
13360 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
13370 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
13380 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
13390 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
133a0 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
133b0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
133c0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
133d0 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
133e0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
133f0 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
13400 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
13410 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
13420 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
13430 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
13440 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
13450 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
13460 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
13470 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
13480 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
13490 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
134a0 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
134b0 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
134c0 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
134d0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
134e0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
134f0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
13500 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
13510 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
13520 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
13530 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
13540 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
13550 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
13560 74 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  t() for the seco
13570 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
13580 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
13590 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
135a0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
135b0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
135c0 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
135d0 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
135e0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
135f0 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
13600 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
13610 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
13620 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
13630 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
13640 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13650 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
13660 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
13670 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
13680 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
13690 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
136a0 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
136b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
136c0 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
136d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
136e0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
136f0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
13700 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
13710 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
13720 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
13730 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
13740 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
13750 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
13760 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
13770 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
13780 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
13790 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
137a0 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
137b0 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
137c0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
137d0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
137e0 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
137f0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
13800 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13810 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
13820 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
13830 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
13840 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13850 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
13860 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
13870 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
13880 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13890 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
138a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
138b0 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d      pBt->db = p-
138c0 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >db;.#ifndef SQL
138d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
138e0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
138f0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
13900 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
13910 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
13920 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
13930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13940 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13950 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
13960 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13970 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
13980 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
13990 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
139a0 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
139b0 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
139c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
139d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
139e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
139f0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
13a00 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
13a10 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
13a20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13a30 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
13a40 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
13a50 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
13a60 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
13a70 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
13a80 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
13a90 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
13aa0 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  d should be invo
13ab0 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ked.** prior to 
13ac0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
13ad0 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
13ae0 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
13af0 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c  utine did.** all
13b00 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
13b10 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
13b20 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
13b30 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
13b40 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
13b50 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
13b60 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
13b70 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
13b80 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
13b90 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
13ba0 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
13bb0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
13bc0 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61  nal.** (which ca
13bd0 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
13be0 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
13bf0 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  and drop locks..
13c00 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
13c10 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
13c20 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
13c30 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
13c40 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
13c50 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
13c60 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
13c70 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
13c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13c90 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
13ca0 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
13cb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13cc0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
13cd0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13ce0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
13cf0 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  db;.  btreeInteg
13d00 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
13d10 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
13d20 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
13d30 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
13d40 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
13d50 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
13d60 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
13d70 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
13d80 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
13d90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
13da0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
13db0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
13dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13dd0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
13de0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
13df0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13e00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
13e10 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13e20 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
13e30 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
13e40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
13e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
13e70 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
13e80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
13e90 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
13ea0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
13eb0 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  EAD;.    pBt->in
13ec0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
13ed0 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
13ee0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
13ef0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
13f00 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
13f10 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
13f20 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
13f30 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
13f40 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
13f50 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
13f60 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
13f70 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
13f80 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
13f90 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
13fa0 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
13fb0 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
13fc0 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
13fd0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
13fe0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13ff0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
14000 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ONE ){.    pBt->
14010 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
14020 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
14030 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
14040 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
14050 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
14060 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
14070 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68  ..  /* Set the h
14080 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74  andles current t
14090 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
140a0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
140b0 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
140c0 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
140d0 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
140e0 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
140f0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
14100 0a 20 20 2a 2f 0a 20 20 62 74 72 65 65 43 6c 65  .  */.  btreeCle
14110 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
14120 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  );.  p->inTrans 
14130 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
14140 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14150 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
14160 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14170 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14180 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
14190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
141a0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
141b0 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
141c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
141d0 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
141e0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
141f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14200 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
14210 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
14220 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
14230 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
14250 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14260 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
14270 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
14280 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
142a0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
142b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
142c0 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
142d0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
142e0 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
142f0 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
14300 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
14310 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
14320 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
14330 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
14340 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
14350 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
14360 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
14370 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
14380 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
14390 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
143a0 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
143b0 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
143c0 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
143d0 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
143e0 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
143f0 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
14400 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
14410 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
14420 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
14430 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
14440 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
14450 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
14460 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
14470 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
14480 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
14490 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
144a0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
144b0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
144c0 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
144d0 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
144e0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
144f0 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
14500 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
14510 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
14520 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14530 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
14540 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
14550 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
14560 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
14570 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
14580 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
14590 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
145a0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
145b0 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
145c0 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
145d0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
145e0 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
145f0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
14600 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
14610 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
14620 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
14630 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
14640 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14650 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
14660 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
14670 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
14680 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
14690 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
146a0 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
146b0 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
146c0 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
146d0 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
146e0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
146f0 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
14700 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
14710 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
14720 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
14730 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
14740 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
14750 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
14760 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
14770 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
14780 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
14790 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
147a0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
147b0 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
147c0 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
147d0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
147e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
147f0 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
14800 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
14810 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
14820 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
14830 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
14840 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
14850 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
14860 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
14870 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65  .    p->skip = e
14880 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
14890 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
148a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
148b0 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
148c0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
148d0 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
148e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
148f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14900 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
14910 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
14920 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
14930 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
14940 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
14950 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
14960 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
14970 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
14980 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
14990 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
149a0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
149b0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
149c0 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
149d0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
149e0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
149f0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
14a00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14a10 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
14a20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
14a30 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
14a40 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
14a50 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
14a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
14a70 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b  lback(Btree *p){
14a80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
14a90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14aa0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
14ab0 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
14ac0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14ad0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
14ae0 64 62 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41  db;.  rc = saveA
14af0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
14b00 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
14b10 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
14b20 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
14b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14b40 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
14b50 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
14b60 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
14b70 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
14b80 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a  ed whilst.    **
14b90 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
14ba0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73  cursor positions
14bb0 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
14bc0 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61  automatic rollba
14bd0 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68  ck (as.    ** th
14be0 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f  e result of a co
14bf0 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63  nstraint, malloc
14c00 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f  () failure or IO
14c10 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20   error) then .  
14c20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d    ** the cache m
14c30 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ay be internally
14c40 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e   inconsistent (n
14c50 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64  ot contain valid
14c60 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a   trees) so.    *
14c70 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70  * we cannot simp
14c80 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  ly return the er
14c90 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ror to the calle
14ca0 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72  r. Instead, abor
14cb0 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75  t .    ** all qu
14cc0 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62  eries that may b
14cd0 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74  e using any of t
14ce0 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
14cf0 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a  failed to save..
14d00 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
14d10 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
14d20 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20  rsors(p, rc);.  
14d30 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
14d40 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
14d50 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
14d60 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
14d70 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
14d80 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
14d90 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
14da0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
14db0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
14dc0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
14dd0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
14de0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
14df0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
14e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14e10 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
14e20 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
14e30 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
14e40 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
14e50 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
14e60 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
14e70 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
14e80 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
14e90 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
14ea0 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
14eb0 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
14ec0 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
14ed0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
14ee0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
14ef0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
14f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14f10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
14f20 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
14f30 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
14f40 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
14f50 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
14f60 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
14f70 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
14f80 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
14f90 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
14fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
14fb0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
14fc0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
14fd0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
14fe0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
14ff0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
15000 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15010 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
15020 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
15030 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
15040 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d 3e  tent(pBt);.  p->
15050 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
15060 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53  NONE;.  pBt->inS
15070 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63  tmt = 0;.  unloc
15080 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
15090 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  Bt);..  btreeInt
150a0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
150b0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
150c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
150d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
150e0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
150f0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20  ansaction.  The 
15100 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
15110 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  an.** can be rol
15120 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  led back indepen
15130 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
15140 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  in transaction..
15150 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  ** You must star
15160 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
15170 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
15180 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
15190 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e  ..** The subtran
151a0 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
151b0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69   automatically i
151c0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
151d0 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74  action.** commit
151e0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
151f0 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20  .**.** Only one 
15200 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  subtransaction m
15210 61 79 20 62 65 20 61 63 74 69 76 65 20 61 74 20  ay be active at 
15220 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61  a time.  It is a
15230 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a  n error to try.*
15240 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  * to start a new
15250 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
15260 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72  if another subtr
15270 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
15280 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a  eady active..**.
15290 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
152a0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
152b0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
152c0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
152d0 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
152e0 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
152f0 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
15300 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
15310 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
15320 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
15330 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
15340 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
15350 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
15360 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
15370 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
15380 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
15390 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
153a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
153b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
153c0 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
153d0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
153e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
153f0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
15400 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15410 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
15420 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
15430 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
15440 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
15450 74 28 20 21 70 42 74 2d 3e 69 6e 53 74 6d 74 20  t( !pBt->inStmt 
15460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
15470 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
15480 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
15490 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
154a0 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 69 6e 53  RITE || pBt->inS
154b0 74 6d 74 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64  tmt || pBt->read
154c0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63 20  Only) ){.    rc 
154d0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  = SQLITE_INTERNA
154e0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
154f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
15500 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
15510 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 2f  S_WRITE );.    /
15520 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
15530 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
15540 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
15550 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
15560 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65  h.    ** an inde
15570 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
15580 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
15590 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
155a0 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51   using.    ** SQ
155b0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
155c0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
155d0 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
155e0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20  rollback any.   
155f0 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69   ** such savepoi
15600 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74  nts while the st
15610 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
15620 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
15630 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a   active..    */.
15640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15650 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
15660 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
15670 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
15680 74 2b 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  t+1);.    pBt->i
15690 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  nStmt = 1;.  }. 
156a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
156b0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
156c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
156d0 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74  mit the statment
156e0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
156f0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
15700 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a  gress.  If no.**
15710 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
15720 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20  is active, this 
15730 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
15740 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
15750 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20  ommitStmt(Btree 
15760 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
15770 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15780 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
15790 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
157a0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
157b0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  db;.  assert( pB
157c0 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  t->readOnly==0 )
157d0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53  ;.  if( pBt->inS
157e0 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  tmt ){.    int i
157f0 53 74 6d 74 70 6f 69 6e 74 20 3d 20 70 2d 3e 64  Stmtpoint = p->d
15800 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20  b->nSavepoint;. 
15810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15820 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
15830 74 2d 3e 70 50 61 67 65 72 2c 20 53 41 56 45 50  t->pPager, SAVEP
15840 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
15850 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20 7d 65 6c  tmtpoint);.  }el
15860 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
15870 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42  ITE_OK;.  }.  pB
15880 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
15890 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
158a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
158b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
158c0 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65  lback the active
158d0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
158e0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e  ansaction.  If n
158f0 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  o subtransaction
15900 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74 68  .** is active th
15910 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
15920 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  no-op..**.** All
15930 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
15940 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
15950 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
15960 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20   Any attempt.** 
15970 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 20  to use a cursor 
15980 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
15990 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
159a0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
159b0 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  .** will result 
159c0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  in an error..*/.
159d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
159e0 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72  RollbackStmt(Btr
159f0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
15a00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15a10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15a20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
15a30 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15a40 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
15a50 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  b;.  assert( pBt
15a60 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
15a70 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
15a80 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  mt ){.    int iS
15a90 74 6d 74 70 6f 69 6e 74 20 3d 20 70 2d 3e 64 62  tmtpoint = p->db
15aa0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->nSavepoint;.  
15ab0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15ac0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
15ad0 2d 3e 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f  ->pPager, SAVEPO
15ae0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
15af0 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  tmtpoint);.    i
15b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15b10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
15b20 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
15b30 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
15b40 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
15b50 41 53 45 2c 20 69 53 74 6d 74 70 6f 69 6e 74 29  ASE, iStmtpoint)
15b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
15b70 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
15b80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15b90 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15ba0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
15bb0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15bc0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
15bd0 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
15be0 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
15bf0 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
15c00 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
15c10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
15c20 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
15c30 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
15c40 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
15c50 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
15c60 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
15c70 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
15c80 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
15c90 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
15ca0 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
15cb0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
15cc0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
15cd0 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
15ce0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
15cf0 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
15d00 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
15d10 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
15d20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
15d30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
15d40 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
15d50 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
15d60 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
15d70 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
15d80 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
15d90 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
15da0 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
15db0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
15dc0 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
15dd0 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
15de0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
15df0 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
15e00 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
15e10 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
15e20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15e30 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
15e40 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
15e50 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
15e60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15e70 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
15e80 3e 69 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  >inStmt==0 );.  
15e90 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
15ea0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
15eb0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
15ec0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
15ed0 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
15ee0 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
15ef0 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
15f00 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
15f10 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
15f20 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15f30 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
15f40 70 2d 3e 64 62 3b 0a 20 20 20 20 72 63 20 3d 20  p->db;.    rc = 
15f50 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
15f60 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
15f70 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
15f80 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
15f90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15fa0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
15fb0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ase(pBt);.    }.
15fc0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15fd0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
15fe0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15ff0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
16000 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
16010 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
16020 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
16030 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20  ** iTable.  The 
16040 61 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67  act of acquiring
16050 20 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61   a cursor gets a
16060 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a   read lock on .*
16070 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
16080 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ile..**.** If wr
16090 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
160a0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
160b0 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
160c0 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
160d0 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
160e0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
160f0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
16100 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
16110 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
16120 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
16130 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
16140 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
16150 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
16160 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
16170 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
16180 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
16190 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
161a0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
161b0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
161c0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
161d0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
161e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
161f0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
16200 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
16210 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
16220 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
16230 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
16240 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
16250 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
16260 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
16270 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
16280 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
16290 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
162a0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
162b0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
162c0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
162d0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
162e0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
162f0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
16300 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16310 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
16320 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
16330 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
16340 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
16350 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
16360 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
16370 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
16380 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
16390 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
163a0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
163b0 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
163c0 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
163d0 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
163e0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
163f0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
16400 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
16410 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
16420 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
16430 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
16440 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
16450 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79  eCursorSize() by
16460 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a  tes of memory .*
16470 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
16480 70 43 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a  pCur have been z
16490 65 72 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c  eroed by the cal
164a0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
164b0 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
164c0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
164f0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
16500 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16520 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
16530 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
16540 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
16570 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
16580 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
16590 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
165a0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
165b0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
165c0 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
165d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
165e0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16600 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
16610 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
16620 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
16630 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74 53 68 61  o nPage;.  BtSha
16640 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16650 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
16660 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
16670 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
16680 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
16690 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  | wrFlag==1 );. 
166a0 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
166b0 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
166c0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20  >readOnly );.   
166d0 20 69 66 28 20 4e 45 56 45 52 28 70 42 74 2d 3e   if( NEVER(pBt->
166e0 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
166f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16700 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
16710 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
16720 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
16730 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, 0, 0) ){.    
16740 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16750 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
16760 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  }..  if( pBt->pP
16770 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  age1==0 ){.    r
16780 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  c = lockBtreeWit
16790 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69  hRetry(p);.    i
167a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
167b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
167c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
167d0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
167e0 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
167f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16800 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
16810 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a  ->pPager, (int *
16820 29 26 6e 50 61 67 65 29 3b 20 0a 20 20 69 66 28  )&nPage); .  if(
16830 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16840 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
16850 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
16860 65 3d 3d 31 20 26 26 20 6e 50 61 67 65 3d 3d 30  e==1 && nPage==0
16870 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
16880 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67  ITE_EMPTY;.    g
16890 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
168a0 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
168b0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
168c0 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
168d0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
168e0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20  r->apPage[0]);. 
168f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16900 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
16910 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
16920 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  eption;.  }..  /
16930 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
16940 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
16950 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
16960 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
16970 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
16980 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75  les, link the cu
16990 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
169a0 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20  Shared list and 
169b0 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a  set *ppCur (the.
169c0 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75    ** output argu
169d0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
169e0 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70  ction)..  */.  p
169f0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
16a00 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
16a10 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
16a20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
16a30 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
16a40 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20  = (u8)wrFlag;.  
16a50 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
16a60 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
16a70 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
16a80 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
16a90 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
16aa0 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
16ab0 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
16ac0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
16ad0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a 20 20 72  OR_INVALID;..  r
16ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16af0 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  ..create_cursor_
16b00 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c  exception:.  rel
16b10 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
16b20 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 75 6e 6c  pPage[0]);.  unl
16b30 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
16b40 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pBt);.  return 
16b50 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
16b60 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
16b70 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16ba0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
16bb0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16be0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
16bf0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
16c00 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
16c30 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
16c40 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
16c50 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16c60 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
16c70 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
16c80 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
16c90 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
16ca0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cc0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
16cd0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
16ce0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
16cf0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16d00 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d  ;.  p->pBt->db =
16d10 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62   p->db;.  rc = b
16d20 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
16d30 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
16d40 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
16d50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16d60 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16d70 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
16d80 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
16d90 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a  (){.  return siz
16da0 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d  eof(BtCursor);.}
16db0 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  ..../*.** Close 
16dc0 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
16dd0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
16de0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
16df0 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
16e00 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
16e10 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
16e20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16e30 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
16e40 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
16e50 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
16e60 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
16e70 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
16e80 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
16e90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
16ea0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
16eb0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
16ec0 72 65 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64  ree);.    pBt->d
16ed0 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a  b = pBtree->db;.
16ee0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16ef0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
16f00 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
16f10 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
16f20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
16f30 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
16f40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16f50 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
16f60 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
16f70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
16f80 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
16f90 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
16fa0 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
16fb0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
16fc0 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
16fd0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
16fe0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
16ff0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
17000 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
17010 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
17020 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64  Bt);.    invalid
17030 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
17040 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73  (pCur);.    /* s
17050 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
17060 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
17070 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
17080 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
17090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
170a0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d  /*.** Make a tem
170b0 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79  porary cursor by
170c0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
170d0 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43  fields of pTempC
170e0 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f  ur..** The tempo
170f0 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e  rary cursor is n
17100 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ot on the cursor
17110 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74   list for the Bt
17120 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ree..*/.void sql
17130 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70  ite3BtreeGetTemp
17140 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
17150 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20  *pCur, BtCursor 
17160 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 69 6e  *pTempCur){.  in
17170 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63  t i;.  assert( c
17180 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
17190 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70  pCur) );.  memcp
171a0 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
171b0 2c 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  , sizeof(BtCurso
171c0 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  r));.  pTempCur-
171d0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54  >pNext = 0;.  pT
171e0 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20  empCur->pPrev = 
171f0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
17200 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50 61 67 65  =pTempCur->iPage
17210 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
17220 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65 6d  te3PagerRef(pTem
17230 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
17240 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  >pDbPage);.  }. 
17250 20 61 73 73 65 72 74 28 20 70 54 65 6d 70 43 75   assert( pTempCu
17260 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a 7d 0a  r->pKey==0 );.}.
17270 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
17280 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
17290 20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64   such as was mad
172a0 65 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54  e by the CreateT
172b0 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29  emporaryCursor()
172c0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f  .** function abo
172d0 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ve..*/.void sqli
172e0 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54  te3BtreeReleaseT
172f0 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
17300 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
17310 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   i;.  assert( cu
17320 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
17330 43 75 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  Cur) );.  for(i=
17340 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
17350 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  e; i++){.    sql
17360 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
17370 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
17380 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
17390 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
173a0 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 2f 2a 0a  r->pKey);.}../*.
173b0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
173c0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
173d0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
173e0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
173f0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
17400 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
17410 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
17420 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71  alid, call.** sq
17430 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
17440 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
17450 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
17460 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
17470 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
17480 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
17490 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
174a0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
174b0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
174c0 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73  er of calls to s
174d0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
174e0 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
174f0 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
17500 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
17510 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
17520 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
17530 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
17540 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
17550 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
17560 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
17570 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
17580 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
17590 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
175a0 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
175b0 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
175c0 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
175d0 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
175e0 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
175f0 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
17600 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
17610 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
17620 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
17630 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
17640 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
17650 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
17660 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
17670 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
17680 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
17690 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
176a0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
176b0 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
176c0 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
176d0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
176e0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
176f0 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
17700 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
17710 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
17720 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
17730 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
17740 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
17750 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
17760 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
17770 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
17780 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
17790 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
177a0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
177b0 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
177c0 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
177d0 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
177e0 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
177f0 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
17800 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
17810 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
17820 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
17830 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
17840 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
17850 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
17860 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
17870 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
17880 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
17890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
178a0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
178b0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
178c0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
178d0 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
178e0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
178f0 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
17900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
17910 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
17920 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
17930 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
17940 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
17950 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
17960 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
17970 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
17980 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
17990 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
179a0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
179f0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
17a00 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a30 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
17a40 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
17a50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a80 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c         \.    sql
17a90 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
17aa0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
17ab0 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
17ac0 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
17ad0 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43  >info); \.    pC
17ae0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
17af0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
17b30 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
17b80 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
17b90 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
17bd0 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
17be0 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  VER */../*.** Se
17bf0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
17c00 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
17c10 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
17c20 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
17c30 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
17c40 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
17c50 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
17c60 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
17c70 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
17c80 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
17c90 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
17ca0 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
17cb0 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
17cc0 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
17cd0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
17ce0 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
17cf0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
17d00 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
17d10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17d20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
17d30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
17d40 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
17d50 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
17d60 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
17d70 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
17d80 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
17d90 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
17da0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17db0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17dc0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17dd0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
17de0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17df0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
17e00 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
17e10 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
17e20 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69  ID ){.      *pSi
17e30 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
17e40 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
17e50 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
17e60 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
17e70 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
17e80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17e90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
17ea0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
17eb0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
17ec0 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
17ed0 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
17ee0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
17ef0 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65  s to.  Always re
17f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
17f10 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f  ** Failure is no
17f20 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20  t possible.  If 
17f30 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
17f40 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
17f50 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e  ointing to an en
17f60 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68  try (which can h
17f70 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70  appen, for examp
17f80 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61  le, if.** the da
17f90 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29  tabase is empty)
17fa0 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20   then *pSize is 
17fb0 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74  set to 0..*/.int
17fc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
17fd0 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  aSize(BtCursor *
17fe0 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65  pCur, u32 *pSize
17ff0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
18000 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
18010 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
18020 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
18030 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18040 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
18050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18060 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18070 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
18080 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
18090 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
180a0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
180b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
180c0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
180d0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
180e0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
180f0 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
18100 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
18110 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
18120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
18130 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
18140 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
18150 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
18160 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
18170 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18180 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
18190 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
181a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
181b0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
181c0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
181d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
181e0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
181f0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
18200 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
18210 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
18220 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
18230 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
18240 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
18250 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
18260 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
18270 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
18280 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
18290 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
182a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
182b0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
182c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
182d0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
182e0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
182f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
18300 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
18310 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
18320 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
18330 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
18340 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
18350 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
18360 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
18370 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
18380 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
18390 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
183a0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
183b0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
183c0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
183d0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
183e0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
183f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
18400 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
18410 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
18420 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
18430 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
18440 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
18450 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
18460 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
18470 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
18480 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
18490 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
184a0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
184b0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
184c0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
184d0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
184e0 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
184f0 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
18500 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
18510 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
18520 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
18530 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
18540 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
18550 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
18560 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18580 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
18590 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
185a0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
185b0 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
185c0 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
185d0 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
185e0 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
185f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
18600 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
18610 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
18620 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
18630 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
18640 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
18650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
18660 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18670 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18680 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
18690 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
186a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
186b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
186c0 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
186d0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
186e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
186f0 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
18700 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
18710 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
18720 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
18730 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
18740 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
18750 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
18760 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
18770 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
18780 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
18790 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
187a0 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
187b0 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
187c0 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
187d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
187e0 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
187f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
18800 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
18810 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
18820 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
18830 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
18840 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
18850 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
18860 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
18870 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
18880 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
18890 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
188a0 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
188b0 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50  ( iGuess<=pagerP
188c0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
188d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
188e0 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
188f0 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
18900 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
18910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
18920 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
18930 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
18940 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
18950 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
18960 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18970 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
18980 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
18990 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
189a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
189b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
189c0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
189d0 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   &pPage, 0);.   
189e0 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
189f0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
18a00 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  0);.    if( next
18a10 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
18a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
18a30 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
18a40 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
18a50 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
18a60 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
18a70 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
18a80 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
18a90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
18aa0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
18ab0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18ac0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
18ad0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
18ae0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
18af0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
18b00 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
18b10 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
18b20 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
18b30 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
18b40 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
18b50 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
18b60 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
18b70 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
18b80 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
18b90 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
18ba0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
18bb0 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
18bc0 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
18bd0 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
18be0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
18bf0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
18c00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
18c10 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
18c20 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
18c30 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
18c40 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
18c50 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
18c60 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
18c70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
18c80 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
18c90 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
18ca0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
18cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
18cc0 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
18cd0 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
18ce0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
18cf0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
18d00 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
18d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
18d30 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
18d40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18d50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
18d60 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
18d70 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
18d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
18d90 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
18da0 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
18db0 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
18dc0 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
18dd0 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
18de0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
18df0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
18e00 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
18e10 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
18e20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
18e30 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
18e40 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
18e50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
18e60 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
18e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18e80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
18ea0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
18eb0 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
18ec0 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
18ed0 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
18ee0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
18ef0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
18f00 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
18f10 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
18f20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18f30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18f40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18f50 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
18f60 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
18f70 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
18f80 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
18f90 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
18fa0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
18fb0 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
18fc0 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
18fd0 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
18fe0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
18ff0 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
19000 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
19010 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
19020 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
19030 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
19040 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
19050 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
19060 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
19070 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
19080 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
19090 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
190a0 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
190b0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
190c0 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  uf..**.** This r
190d0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
190e0 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69  make a distincti
190f0 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61  on between key a
19100 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a  nd data..** It j
19110 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69  ust reads or wri
19120 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  tes bytes from t
19130 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
19140 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a    Data might .**
19150 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
19160 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73  ain page or be s
19170 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
19180 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
19190 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a  w .** pages..**.
191a0 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
191b0 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
191c0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
191d0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
191e0 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
191f0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
19200 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
19210 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
19220 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
19230 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
19240 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
19250 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
19260 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
19270 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
19280 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
19290 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
192a0 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
192b0 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
192c0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
192d0 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
192e0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
192f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
19300 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
19310 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
19320 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
19330 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
19340 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
19350 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
19360 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
19370 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
19380 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
19390 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
193a0 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
193b0 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
193c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
193d0 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
193e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
193f0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
19400 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
19410 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
19420 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
19430 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
19440 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
19450 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
19460 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
19470 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
19480 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
19490 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
194a0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
194b0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
194c0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
194d0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
194e0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
194f0 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
19500 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
19510 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
19520 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
19530 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
19540 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
19550 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
19560 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
19570 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
19580 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
19590 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
195a0 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20  t skipKey,      
195b0 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
195c0 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
195d0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  his is true */. 
195e0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
195f0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
19600 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
19610 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
19620 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
19630 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
19640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19650 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
19660 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
19670 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
19680 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
19690 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
196a0 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
196b0 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
196c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
196d0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
196e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
196f0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
19700 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
19710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
19720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
19730 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19740 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
19750 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
19760 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
19770 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
19780 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19790 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
197a0 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
197b0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
197c0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
197d0 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
197e0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
197f0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
19800 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
19810 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
19820 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
19830 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  {.    offset += 
19840 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
19850 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65  offset+amt > nKe
19860 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  y+pCur->info.nDa
19870 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c  ta .   || &aPayl
19880 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
19890 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
198a0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
198b0 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20  leSize].  ){.   
198c0 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
198d0 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
198e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
198f0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
19900 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
19910 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19920 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
19930 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
19940 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
19950 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
19960 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
19970 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
19980 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19990 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
199a0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
199b0 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
199c0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
199d0 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
199e0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
199f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
19a00 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
19a10 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
19a20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
19a30 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
19a40 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
19a50 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
19a60 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
19a70 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
19a80 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
19a90 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
19aa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19ab0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
19ac0 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
19ad0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
19ae0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
19af0 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
19b00 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
19b10 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
19b20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
19b30 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
19b40 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
19b50 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
19b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
19b70 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
19b80 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
19b90 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
19ba0 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
19bb0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
19bc0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
19bd0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
19be0 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
19bf0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
19c00 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
19c10 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
19c20 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
19c30 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
19c40 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
19c50 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
19c60 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
19c70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
19c80 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
19c90 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
19ca0 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
19cb0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
19cc0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
19cd0 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
19ce0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
19cf0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
19d00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
19d10 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
19d20 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
19d30 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
19d40 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
19d50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
19d60 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
19d70 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
19d80 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
19d90 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
19da0 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
19db0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
19dc0 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
19dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
19de0 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  l && !pCur->aOve
19df0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
19e00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
19e10 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
19e20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
19e30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
19e40 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
19e50 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
19e60 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
19e70 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
19e80 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
19e90 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
19ea0 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
19eb0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
19ec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
19ed0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
19ee0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
19ef0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
19f00 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
19f10 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
19f20 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
19f30 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
19f40 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
19f50 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
19f60 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
19f70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
19f80 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
19f90 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
19fa0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
19fb0 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
19fc0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
19fd0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
19fe0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
19ff0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1a000 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
1a010 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
1a020 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
1a030 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
1a040 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1a050 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
1a060 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
1a070 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1a080 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1a090 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
1a0a0 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
1a0b0 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
1a0c0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
1a0d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1a0e0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
1a0f0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
1a100 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
1a110 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
1a120 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
1a130 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1a140 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
1a150 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1a160 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
1a170 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
1a180 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
1a190 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
1a1a0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
1a1b0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
1a1c0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
1a1d0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
1a1e0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
1a1f0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
1a200 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
1a210 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1a220 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
1a230 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1a240 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
1a250 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
1a260 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
1a270 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
1a280 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
1a290 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
1a2a0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
1a2b0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
1a2c0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
1a2d0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
1a2e0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
1a2f0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
1a300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a310 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
1a320 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
1a330 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
1a340 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
1a350 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
1a360 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
1a370 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
1a380 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
1a390 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
1a3a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
1a3b0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
1a3c0 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
1a3d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1a3e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1a3f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
1a400 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
1a410 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1a420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a430 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
1a440 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1a450 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
1a460 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
1a470 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
1a480 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
1a490 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
1a4a0 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
1a4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
1a4c0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
1a4d0 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
1a4e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
1a4f0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
1a500 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
1a510 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
1a520 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1a530 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1a540 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
1a550 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
1a560 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
1a570 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
1a580 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
1a590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a5a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1a5b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a5c0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
1a5d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1a5e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
1a5f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a600 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1a610 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
1a620 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
1a630 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
1a640 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
1a650 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
1a660 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
1a670 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
1a680 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
1a690 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
1a6a0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1a6b0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
1a6c0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
1a6d0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1a6e0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
1a6f0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
1a700 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
1a710 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
1a720 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
1a730 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a740 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
1a750 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
1a760 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
1a770 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
1a780 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
1a790 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1a7a0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1a7b0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1a7c0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1a7d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a7e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a7f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a800 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1a810 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1a820 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1a830 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1a840 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  age] );.    if( 
1a850 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
1a860 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1a870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1a880 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1a890 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1a8a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1a8b0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1a8c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1a8d0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1a8e0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
1a8f0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1a900 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
1a910 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30  char*)pBuf, 0, 0
1a920 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a930 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
1a940 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
1a950 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
1a960 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
1a970 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
1a980 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
1a990 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
1a9a0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
1a9b0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
1a9c0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
1a9d0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1a9e0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
1a9f0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1aa00 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1aa10 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
1aa20 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1aa30 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
1aa40 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
1aa50 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
1aa60 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
1aa70 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
1aa80 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
1aa90 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
1aaa0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
1aab0 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
1aac0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aad0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
1aae0 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
1aaf0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1ab00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ab10 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
1ab20 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1ab30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ab40 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1ab50 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1ab60 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1ab70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ab80 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1ab90 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1aba0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1abb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1abc0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
1abd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1abe0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
1abf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1ac00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1ac10 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
1ac20 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1ac30 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
1ac40 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
1ac50 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
1ac60 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  Buf, 1, 0);.  }.
1ac70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ac80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1ac90 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
1aca0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
1acb0 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
1acc0 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
1acd0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1ace0 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
1acf0 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
1ad00 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
1ad10 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
1ad20 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
1ad30 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1ad40 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
1ad50 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
1ad60 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1ad70 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
1ad80 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
1ad90 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
1ada0 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
1adb0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
1adc0 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
1add0 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
1ade0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
1adf0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
1ae00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
1ae10 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
1ae20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
1ae30 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
1ae40 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
1ae50 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
1ae60 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
1ae70 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
1ae80 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
1ae90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
1aea0 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
1aeb0 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
1aec0 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
1aed0 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
1aee0 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
1aef0 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
1af00 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
1af10 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
1af20 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
1af30 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
1af40 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mbly.** the key/
1af50 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
1af60 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
1af70 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
1af80 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
1af90 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
1afa0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
1afb0 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
1afc0 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
1afd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1afe0 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
1aff0 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
1b000 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
1b010 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
1b020 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
1b030 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
1b040 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
1b050 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
1b060 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1b070 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1b080 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1b090 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
1b0a0 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
1b0b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1b0c0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1b0d0 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
1b0e0 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
1b0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
1b100 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
1b110 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
1b120 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
1b130 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
1b140 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
1b150 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
1b160 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
1b170 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
1b180 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
1b190 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1b1a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1b1b0 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
1b1c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b1d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1b1e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1b1f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1b200 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1b210 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1b220 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
1b230 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b240 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1b250 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
1b260 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1b270 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1b280 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
1b290 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
1b2a0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1b2b0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1b2c0 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
1b2d0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1b2e0 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75   nKey = (int)pCu
1b2f0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1b300 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
1b310 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
1b320 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
1b330 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1b340 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
1b350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
1b360 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1b370 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
1b380 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
1b390 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
1b3a0 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
1b3b0 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
1b3c0 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
1b3d0 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
1b3e0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1b3f0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
1b400 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
1b410 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
1b420 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
1b430 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
1b440 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
1b450 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
1b460 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
1b470 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1b480 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
1b490 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
1b4a0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
1b4b0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
1b4c0 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
1b4d0 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
1b4e0 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
1b4f0 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
1b500 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
1b510 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
1b520 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
1b530 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
1b540 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
1b550 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
1b560 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
1b570 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
1b580 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
1b590 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1b5a0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1b5b0 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
1b5c0 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
1b5d0 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
1b5e0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
1b5f0 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
1b600 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1b610 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
1b620 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1b630 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
1b640 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1b650 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1b660 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b670 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1b680 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1b690 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1b6a0 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1b6b0 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1b6c0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1b6d0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1b6e0 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n 0;.}.const voi
1b6f0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
1b700 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
1b710 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1b720 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  mt){.  assert( c
1b730 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1b740 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
1b750 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b760 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1b770 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
1b780 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
1b790 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
1b7a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1b7b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1b7c0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1b7d0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
1b7e0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
1b7f0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
1b800 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
1b810 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
1b820 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
1b830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1b840 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
1b850 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
1b860 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
1b870 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
1b880 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
1b890 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1b8a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b8b0 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
1b8c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1b8d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1b8e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b8f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1b900 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1b910 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
1b920 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
1b930 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1b940 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
1b950 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
1b960 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b970 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1b980 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
1b990 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1b9a0 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
1b9b0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1b9c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
1b9d0 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
1b9e0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
1b9f0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
1ba00 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
1ba10 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
1ba20 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1ba30 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1ba40 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
1ba50 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20  ge->nCell<1 ){. 
1ba60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ba70 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1ba80 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1ba90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1baa0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  f NDEBUG./*.** P
1bab0 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
1bac0 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
1bad0 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
1bae0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
1baf0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
1bb00 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1bb10 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
1bb20 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
1bb30 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
1bb40 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
1bb50 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
1bb60 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
1bb70 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
1bb80 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
1bb90 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1bba0 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
1bbb0 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
1bbc0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
1bbd0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
1bbe0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
1bbf0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
1bc00 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
1bc10 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
1bc20 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
1bc30 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
1bc40 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
1bc50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1bc60 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1bc70 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1bc80 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
1bc90 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
1bca0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1bcb0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1bcc0 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
1bcd0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1bce0 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
1bcf0 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
1bd00 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
1bd10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
1bd20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
1bd30 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
1bd40 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
1bd50 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1bd60 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
1bd70 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
1bd80 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
1bd90 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
1bda0 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
1bdb0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
1bdc0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
1bdd0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
1bde0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
1bdf0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
1be00 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
1be10 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
1be20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1be30 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
1be40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1be50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1be60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1be70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1be80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1be90 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1bea0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1beb0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
1bec0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1bed0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1bee0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1bef0 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
1bf00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
1bf10 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
1bf20 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1bf30 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
1bf40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1bf50 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
1bf60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1bf70 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1bf80 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
1bf90 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
1bfa0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1bfb0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1bfc0 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
1bfd0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1bfe0 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1bff0 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1c000 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1c010 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1c020 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1c030 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c040 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
1c050 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1c060 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c070 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
1c080 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1c090 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1c0a0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1c0b0 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
1c0c0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1c0d0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1c0e0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
1c0f0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1c100 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1c110 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
1c120 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1c130 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1c140 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
1c150 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
1c160 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1c170 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
1c180 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1c190 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d  Cur->skip;.    }
1c1a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1c1b0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1c1c0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
1c1d0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
1c1e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1c1f0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72  for(i=1; i<=pCur
1c200 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1c210 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1c220 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1c230 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1c240 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
1c250 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
1c260 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
1c270 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
1c280 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
1c290 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a  age[0])).    ){.
1c2a0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1c2b0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1c2c0 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
1c2d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1c2e0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
1c2f0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
1c300 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1c310 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
1c320 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  t );.  pCur->iPa
1c330 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ge = 0;.  pCur->
1c340 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
1c350 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1c360 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
1c370 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
1c380 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1c390 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
1c3a0 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
1c3b0 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
1c3c0 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
1c3d0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1c3e0 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73  pgno==1 );.    s
1c3f0 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
1c400 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
1c410 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
1c420 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
1c430 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20  ( subpage>0 );. 
1c440 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1c450 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
1c460 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1c470 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
1c480 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
1c490 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1c4a0 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e   ((pRoot->nCell>
1c4b0 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
1c4c0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
1c4d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1c4f0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
1c500 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
1c510 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1c520 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
1c530 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
1c540 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1c550 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
1c560 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
1c570 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1c580 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
1c590 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
1c5a0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
1c5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1c5c0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
1c5d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1c5e0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1c5f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c600 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1c610 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1c620 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c630 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1c640 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1c650 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1c660 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1c670 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
1c680 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1c690 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
1c6a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
1c6b0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1c6c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
1c6d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1c6e0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1c6f0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1c700 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
1c710 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
1c720 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1c730 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1c740 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1c760 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1c770 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
1c780 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1c790 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
1c7a0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1c7b0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1c7c0 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
1c7d0 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
1c7e0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
1c7f0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
1c800 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
1c810 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
1c820 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
1c830 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1c840 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
1c850 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
1c860 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
1c870 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
1c880 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1c890 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
1c8a0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1c8b0 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
1c8c0 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
1c8d0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
1c8e0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
1c8f0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1c900 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1c910 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
1c920 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1c930 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1c940 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c950 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1c960 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1c970 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1c980 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1c990 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1c9a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1c9b0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
1c9c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
1c9d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1c9e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
1c9f0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1ca00 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1ca10 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1ca20 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1ca30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
1ca40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1ca50 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
1ca60 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1ca70 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1ca80 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ca90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1caa0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1cab0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
1cac0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70  ->nCell-1;.    p
1cad0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1cae0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
1caf0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1cb00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1cb10 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1cb20 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
1cb30 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1cb40 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1cb50 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1cb60 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1cb70 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1cb80 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1cb90 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1cba0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1cbb0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1cbc0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1cbd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1cbe0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
1cbf0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1cc00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1cc10 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1cc20 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1cc30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1cc40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1cc50 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1cc60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1cc70 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1cc80 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1cc90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1cca0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1ccb0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1ccc0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1ccd0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1cce0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1ccf0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
1cd00 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
1cd10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cd20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cd30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1cd40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1cd50 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
1cd60 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1cd70 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1cd80 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1cd90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1cda0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
1cdb0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1cdc0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1cdd0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1cde0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1cdf0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1ce00 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1ce10 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1ce20 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1ce30 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1ce40 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1ce50 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1ce60 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1ce70 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
1ce80 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1ce90 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1cea0 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
1ceb0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1cec0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1ced0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1cee0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1cef0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1cf00 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1cf10 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1cf20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cf30 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
1cf40 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1cf50 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
1cf60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1cf70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1cf80 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
1cf90 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1cfa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cfb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1cfc0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1cfd0 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
1cfe0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
1cff0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
1d000 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
1d010 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1d020 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
1d030 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49  tLast = rc==SQLI
1d040 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20  TE_OK ?1:0;.    
1d050 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1d060 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1d070 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
1d080 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
1d090 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
1d0a0 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
1d0b0 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
1d0c0 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
1d0d0 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
1d0e0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
1d0f0 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
1d100 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
1d110 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
1d120 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
1d130 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
1d140 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
1d150 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
1d160 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
1d170 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
1d180 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
1d190 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
1d1a0 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
1d1b0 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
1d1c0 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
1d1d0 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
1d1e0 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
1d1f0 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
1d200 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
1d210 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
1d220 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
1d230 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
1d240 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
1d250 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
1d260 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
1d270 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
1d280 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
1d290 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
1d2a0 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
1d2b0 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
1d2c0 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
1d2d0 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
1d2e0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
1d2f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
1d300 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
1d310 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
1d320 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
1d330 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1d340 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1d350 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1d370 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
1d380 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
1d390 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1d3a0 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
1d3b0 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
1d3c0 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
1d3d0 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
1d3e0 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
1d3f0 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
1d400 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1d410 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1d420 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1d430 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d440 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
1d450 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
1d460 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
1d470 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
1d480 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1d490 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1d4a0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
1d4c0 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
1d4d0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f  y/pIdxKey..**.*/
1d4e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1d4f0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1d500 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1d510 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
1d520 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
1d530 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
1d540 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
1d550 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
1d560 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
1d570 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
1d580 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1d590 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
1d5a0 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
1d5b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1d5c0 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
1d5d0 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
1d5e0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1d5f0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1d600 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
1d610 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1d620 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
1d630 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d640 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1d660 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d670 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1d680 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
1d690 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
1d6a0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
1d6b0 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
1d6c0 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
1d6d0 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
1d6e0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
1d6f0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
1d700 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
1d710 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1d720 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
1d730 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1d740 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70   .   && pCur->ap
1d750 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
1d760 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
1d770 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
1d780 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
1d790 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1d7a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d7b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d7c0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20  pCur->atLast && 
1d7d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
1d7e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1d7f0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
1d800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d810 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1d820 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1d830 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1d840 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1d850 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1d860 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1d870 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1d880 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1d890 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1d8a0 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  ]->isInit );.  i
1d8b0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1d8c0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1d8d0 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
1d8e0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1d8f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1d900 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
1d910 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1d920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d930 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d940 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
1d950 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
1d960 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
1d970 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
1d980 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
1d990 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1d9a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1d9b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1d9c0 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f    int c = -1;  /
1d9d0 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66  * pRes return if
1d9e0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20   table is empty 
1d9f0 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20  must be -1 */.  
1da00 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
1da10 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
1da20 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 28 21 70  l-1;.    if( (!p
1da30 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
1da40 70 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75  pIdxKey==0) || u
1da50 70 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  pr<0 ){.      rc
1da60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1da70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
1da80 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1da90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1daa0 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20  biasRight ){.   
1dab0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1dac0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
1dad0 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73  16)upr;.    }els
1dae0 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e{.      pCur->a
1daf0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1db00 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c  ] = (u16)((upr+l
1db10 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20  wr)/2);.    }.  
1db20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
1db30 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
1db40 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c  .      i64 nCell
1db50 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Key;.      int i
1db60 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
1db70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1db80 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1db90 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
1dba0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1dbb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
1dbc0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1dbd0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65  .        u8 *pCe
1dbe0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ll;.        pCel
1dbf0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1dc00 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
1dc10 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
1dc20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1dc30 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
1dc40 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d          u32 dumm
1dc50 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
1dc60 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ll += getVarint3
1dc70 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b  2(pCell, dummy);
1dc80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dc90 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
1dca0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
1dcb0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
1dcc0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
1dcd0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1dce0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
1dcf0 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
1dd00 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
1dd10 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
1dd20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dd30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1dd40 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
1dd50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
1dd60 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1dd70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dd80 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65     int available
1dd90 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b  ;.        pCellK
1dda0 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74  ey = (void *)fet
1ddb0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1ddc0 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a  &available, 0);.
1ddd0 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79          nCellKey
1dde0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
1ddf0 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
1de00 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c  available>=nCell
1de10 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1de20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
1de30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 28 69  RecordCompare((i
1de40 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65  nt)nCellKey, pCe
1de50 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
1de60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1de70 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
1de80 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
1de90 6f 63 28 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65  oc( (int)nCellKe
1dea0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  y );.          i
1deb0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
1dec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1ded0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1dee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1def0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1df00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1df10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1df20 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
1df30 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b  , 0, (int)nCellK
1df40 65 79 2c 20 28 76 6f 69 64 2a 29 70 43 65 6c 6c  ey, (void*)pCell
1df50 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1df60 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
1df70 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 28 69 6e  ecordCompare((in
1df80 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c  t)nCellKey, pCel
1df90 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
1dfa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1dfb0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
1dfc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1dfd0 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
1dfe0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
1dff0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1e000 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
1e010 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1e020 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
1e030 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1e040 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
1e050 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1e060 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
1e070 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
1e080 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
1e090 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e0a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e0b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1e0c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e0d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1e0e0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1e0f0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
1e100 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1e110 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
1e120 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
1e130 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e140 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
1e150 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1e160 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a   if( lwr>upr ){.
1e170 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
1e180 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
1e190 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ey;.        brea
1e1a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1e1b0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e1c0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
1e1d0 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a  )((lwr+upr)/2);.
1e1e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1e1f0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
1e200 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e210 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
1e220 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1e230 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1e240 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1e250 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
1e260 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
1e270 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1e280 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1e290 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1e2a0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
1e2b0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1e2c0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1e2d0 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
1e2e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
1e2f0 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
1e300 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1e310 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1e320 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
1e330 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1e340 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l );.      if( p
1e350 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b  Res ) *pRes = c;
1e360 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e370 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
1e380 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1e390 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1e3a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1e3b0 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a  ge] = (u16)lwr;.
1e3c0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1e3d0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1e3e0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1e3f0 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  0;.    rc = move
1e400 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
1e410 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
1e420 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f  c ) goto moveto_
1e430 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65  finish;.  }.move
1e440 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74  to_finish:.  ret
1e450 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e460 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
1e470 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c   of BtreeMoveto,
1e480 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65   pKey is a packe
1e490 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a  d index record.*
1e4a0 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e  * such as is gen
1e4b0 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  erated by the OP
1e4c0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1e4d0 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a  de.  Unpack the.
1e4e0 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68  ** record and th
1e4f0 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76  en call BtreeMov
1e500 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
1e510 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f   do the work..*/
1e520 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e530 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
1e540 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
1e550 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
1e560 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   the btree to be
1e570 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
1e580 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1e590 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79     /* Packed key
1e5a0 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73   if the btree is
1e5b0 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   an index */.  i
1e5c0 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
1e5d0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65     /* Integer ke
1e5e0 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53  y for tables.  S
1e5f0 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20  ize of pKey for 
1e600 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
1e610 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20   bias,          
1e620 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20   /* Bias search 
1e630 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
1e640 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
1e650 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1e660 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
1e670 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1e680 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1e690 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
1e6a0 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70  us code */.  Unp
1e6b0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
1e6c0 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
1e6d0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
1e6e0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1e6f0 64 20 61 53 70 61 63 65 5b 31 36 5d 3b 20 2f 2a  d aSpace[16]; /*
1e700 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20   Temp space for 
1e710 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f  pIdxKey - to avo
1e720 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  id a malloc */..
1e730 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1e740 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
1e750 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
1e760 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
1e770 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1e780 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b  dUnpack(pCur->pK
1e790 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65  eyInfo, (int)nKe
1e7a0 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1e7d0 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53  Space, sizeof(aS
1e7e0 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20  pace));.    if( 
1e7f0 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74  pIdxKey==0 ) ret
1e800 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e810 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1e820 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
1e830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e840 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
1e850 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
1e860 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
1e870 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29  s);.  if( pKey )
1e880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1e890 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
1e8a0 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a  ecord(pIdxKey);.
1e8b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e8c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
1e8d0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
1e8e0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1e8f0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1e900 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
1e910 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
1e920 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
1e930 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1e940 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
1e950 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
1e960 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1e970 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
1e980 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
1e990 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
1e9a0 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
1e9b0 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
1e9c0 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
1e9d0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1e9e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
1e9f0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
1ea00 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
1ea10 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
1ea20 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
1ea30 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
1ea40 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
1ea50 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
1ea60 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
1ea70 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
1ea80 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
1ea90 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
1eaa0 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
1eab0 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
1eac0 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
1ead0 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
1eae0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
1eaf0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1eb00 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
1eb10 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
1eb20 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a  e for a cursor..
1eb30 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
1eb40 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 44 62  te3BtreeCursorDb
1eb50 28 63 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20  (const BtCursor 
1eb60 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
1eb70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1eb80 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1eb90 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1eba0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1ebb0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f  pBtree->db;.}../
1ebc0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
1ebd0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
1ebe0 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
1ebf0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1ec00 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1ec10 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1ec20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1ec30 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1ec40 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
1ec50 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1ec60 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1ec70 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1ec80 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1ec90 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1eca0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ecb0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
1ecc0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1ecd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1ece0 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
1ecf0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
1ed00 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1ed10 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1ed20 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1ed30 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1ed40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ed50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1ed60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1ed70 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
1ed80 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1ed90 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1eda0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
1edb0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1edc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1edd0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
1ede0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
1edf0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
1ee00 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1ee10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ee20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
1ee30 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
1ee40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1ee50 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
1ee60 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
1ee70 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1ee80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1ee90 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1eea0 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e  t( idx<=pPage->n
1eeb0 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
1eec0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1eed0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1eee0 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64  ey = 0;.  if( id
1eef0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
1ef00 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
1ef10 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1ef20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1ef30 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
1ef40 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ef50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1ef60 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
1ef70 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ef80 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1ef90 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1efa0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1efb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1efc0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
1efd0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
1efe0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
1eff0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1f000 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1f010 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1f020 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
1f030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f050 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
1f060 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1f070 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
1f080 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f090 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
1f0a0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
1f0b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
1f0c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1f0d0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1f0e0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1f0f0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
1f100 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1f110 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
1f120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f140 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1f150 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
1f160 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
1f170 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
1f180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f190 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
1f1a0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1f1b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1f1c0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
1f1d0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1f1e0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
1f1f0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
1f200 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
1f210 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
1f220 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
1f230 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
1f240 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
1f250 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
1f260 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1f270 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1f280 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1f290 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1f2a0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1f2b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f2c0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1f2d0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1f2e0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1f2f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1f300 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1f310 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f320 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1f330 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1f340 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1f350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f360 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1f370 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74  ;.  }.  pCur->at
1f380 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Last = 0;.  if( 
1f390 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1f3a0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1f3b0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1f3c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f3d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1f3e0 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20  Cur->skip<0 ){. 
1f3f0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
1f400 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
1f410 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1f420 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
1f430 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
1f440 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
1f450 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f460 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
1f470 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1f480 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1f490 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
1f4a0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
1f4b0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
1f4c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1f4d0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
1f4e0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1f4f0 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
1f500 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
1f510 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1f520 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1f530 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1f540 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
1f550 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1f560 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
1f570 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
1f580 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
1f590 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1f5a0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1f5b0 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
1f5c0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
1f5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f5e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f5f0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
1f600 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1f610 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
1f620 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1f630 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1f640 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75  ey = 0;..    pCu
1f650 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1f660 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
1f670 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1f680 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
1f690 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
1f6a0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
1f6b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
1f6c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1f6d0 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
1f6e0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
1f6f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1f700 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1f710 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1f720 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f730 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
1f740 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
1f750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1f760 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
1f770 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
1f780 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
1f790 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
1f7a0 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
1f7b0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f7c0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
1f7d0 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
1f7e0 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
1f7f0 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
1f800 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
1f810 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
1f820 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1f830 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
1f840 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
1f850 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
1f860 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
1f870 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1f880 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
1f890 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
1f8a0 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
1f8b0 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
1f8c0 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
1f8d0 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
1f8e0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
1f8f0 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
1f900 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
1f910 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
1f920 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
1f930 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
1f940 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1f950 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
1f960 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1f970 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65  t 0, then a (fee
1f980 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d  ble) effort is m
1f990 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
1f9a0 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
1f9b0 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
1f9c0 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
1f9d0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
1f9e0 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
1f9f0 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
1fa00 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
1fa10 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
1fa20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
1fa30 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
1fa40 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
1fa50 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
1fa60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65  .**.** If the "e
1fa70 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20  xact" parameter 
1fa80 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68  is not 0, and th
1fa90 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65  e page-number ne
1faa0 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20  arby exists .** 
1fab0 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
1fac0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
1fad0 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  it is guarenteed
1fae0 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
1faf0 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1fb00 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
1fb10 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77  cuum databases w
1fb20 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  hen allocating a
1fb30 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   new table..*/.s
1fb40 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1fb50 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
1fb60 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
1fb70 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
1fb80 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e  e, .  Pgno *pPgn
1fb90 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62  o, .  Pgno nearb
1fba0 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b  y,.  u8 exact.){
1fbb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1fbc0 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
1fbd0 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  int n;     /* Nu
1fbe0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
1fbf0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
1fc00 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a  .  int k;     /*
1fc10 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
1fc20 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
1fc30 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
1fc40 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
1fc50 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
1fc60 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
1fc70 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
1fc80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1fc90 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1fca0 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
1fcb0 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67  >pPage1;.  n = g
1fcc0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1fcd0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69  >aData[36]);.  i
1fce0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
1fcf0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
1fd00 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1fd10 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
1fd20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
1fd30 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
1fd40 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
1fd50 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
1fd60 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
1fd70 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1fd80 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
1fd90 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1fda0 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65  'exact' paramete
1fdb0 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61  r was true and a
1fdc0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
1fdd0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
1fde0 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
1fdf0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
1fe00 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
1fe10 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
1fe20 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
1fe30 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
1fe40 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1fe50 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
1fe60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fe70 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1fe80 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20     if( exact && 
1fe90 6e 65 61 72 62 79 3c 3d 70 61 67 65 72 50 61 67  nearby<=pagerPag
1fea0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
1feb0 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
1fec0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
1fed0 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  rby>0 );.      a
1fee0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
1fef0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
1ff00 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1ff10 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
1ff20 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  pe, 0);.      if
1ff30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1ff40 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1ff50 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1ff60 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  GE ){.        se
1ff70 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
1ff80 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67      }.      *pPg
1ff90 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20  no = nearby;.   
1ffa0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1ffb0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1ffc0 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
1ffd0 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
1ffe0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1fff0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
20000 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
20010 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
20020 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
20030 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
20040 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20050 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
20060 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
20070 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20080 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
20090 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
200a0 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
200b0 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
200c0 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
200d0 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
200e0 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
200f0 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
20100 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
20110 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
20120 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
20130 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
20140 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
20150 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
20160 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
20170 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ..    */.    do 
20180 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
20190 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
201a0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
201b0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
201c0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
201d0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
201e0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
201f0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
20200 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
20210 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
20220 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20240 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
20250 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
20260 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
20270 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
20280 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
20290 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
202a0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
202b0 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
202c0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
202d0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
202e0 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
202f0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
20300 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
20310 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
20320 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
20330 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
20340 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
20350 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
20360 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
20370 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
20380 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
20390 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
203a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
203b0 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
203c0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
203d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
203e0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
203f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
20400 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
20410 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
20420 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
20430 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
20440 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
20450 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
20460 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
20470 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
20480 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
20490 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
204a0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
204b0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
204c0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
204d0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
204e0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
204f0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
20500 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
20510 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
20520 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
20530 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
20540 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
20550 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
20560 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
20570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
20580 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
20590 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
205a0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
205b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
205c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
205d0 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
205e0 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
205f0 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
20600 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
20610 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
20620 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
20630 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
20640 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
20650 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
20660 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
20670 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
20680 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
20690 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
206a0 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
206b0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
206c0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
206d0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
206e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
206f0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
20700 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
20710 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
20720 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
20730 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
20740 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20750 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
20760 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
20770 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
20780 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
20790 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
207a0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
207b0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
207c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
207d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
207e0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
207f0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
20800 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
20810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20830 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
20840 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
20850 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
20860 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
20870 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
20880 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
20890 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
208a0 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
208b0 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
208c0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
208d0 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
208e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
208f0 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
20900 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
20910 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
20920 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
20930 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
20940 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20950 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
20960 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
20970 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
20980 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
20990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
209a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
209b0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
209c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
209d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
209e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
209f0 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
20a00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20a10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20a20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
20a30 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
20a40 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
20a50 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
20a60 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
20a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20a80 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
20a90 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
20aa0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
20ab0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
20ac0 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
20ad0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
20ae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
20af0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
20b00 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
20b10 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
20b20 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
20b30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
20b40 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
20b50 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
20b60 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
20b70 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
20b80 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
20b90 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
20ba0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
20bb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
20bc0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
20bd0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
20be0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20bf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
20c00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20c10 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
20c20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
20c30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20c40 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
20c50 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
20c60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
20c70 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
20c80 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
20c90 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
20ca0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
20cb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
20cc0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
20cd0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
20ce0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
20cf0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
20d00 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
20d10 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
20d20 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
20d30 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
20d40 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
20d50 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
20d60 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74       int closest
20d70 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
20d80 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
20d90 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
20da0 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
20db0 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ta;.        rc =
20dc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20dd0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
20de0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
20df0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
20e00 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
20e10 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
20e20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
20e30 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
20e40 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74       int i, dist
20e50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
20e60 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
20e70 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79     dist = get4by
20e80 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
20e90 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
20ea0 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64    if( dist<0 ) d
20eb0 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20  ist = -dist;.   
20ec0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
20ed0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
20ee0 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
20ef0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
20f00 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
20f10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
20f20 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64  ( d2<0 ) d2 = -d
20f30 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  2;.            i
20f40 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
20f50 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
20f60 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
20f70 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
20f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
20f90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20fb0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
20fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
20fd0 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
20fe0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
20ff0 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
21000 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
21010 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65  ist || iPage==ne
21020 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
21030 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
21040 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
21050 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  nPage;.         
21060 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
21070 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61 67 65  .          nPage
21080 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
21090 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  t(pBt);.        
210a0 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61    if( *pPgno>nPa
210b0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
210c0 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f    /* Free page o
210d0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
210e0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
210f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21100 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21110 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
21120 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
21130 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
21140 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
21150 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
21160 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
21170 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21190 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
211a0 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
211b0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
211c0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
211d0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
211e0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
211f0 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
21200 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
21210 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
21220 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
21230 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
21240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21250 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
21260 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
21270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
21280 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
21290 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70  teable(pTrunk->p
212a0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
212b0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
212c0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
212d0 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
212e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
212f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
21300 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
21310 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
21320 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
21330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21360 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
21370 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
21380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
213b0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
213c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
213d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
213e0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
213f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
21400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21410 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
21420 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
21430 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
21440 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
21450 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
21460 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
21470 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
21480 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63  e freelist, so c
21490 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
214a0 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   at the.    ** e
214b0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
214c0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
214d0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
214e0 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e  (pBt);.    *pPgn
214f0 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a  o = nPage + 1;..
21500 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
21510 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
21520 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
21530 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
21540 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
21550 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
21560 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
21570 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
21580 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
21590 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
215a0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
215b0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
215c0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
215d0 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
215e0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
215f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
21600 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
21610 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
21620 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
21630 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
21640 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
21650 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
21660 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
21670 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
21680 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
21690 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
216a0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
216b0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
216c0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
216d0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
216e0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
216f0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
21700 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
21710 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d       if( *pPgno=
21720 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
21730 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67  GE(pBt) ){ (*pPg
21740 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  no)++; }.    }.#
21750 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72  endif..    asser
21760 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
21770 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
21780 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
21790 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
217a0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
217b0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  pPage, 0);.    i
217c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
217d0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
217e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
217f0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
21800 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21820 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
21830 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
21840 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
21850 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
21860 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
21870 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
21880 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
21890 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
218a0 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
218b0 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
218c0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
218d0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
218e0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69  pPrevTrunk);.  i
218f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21900 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
21910 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
21920 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
21930 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
21940 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21950 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
21960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21970 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
21980 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
21990 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
219a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
219b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
219c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
219d0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
219e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
219f0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
21a00 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
21a10 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
21a20 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
21a30 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
21a40 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
21a50 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
21a60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
21a70 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
21a80 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
21a90 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
21aa0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
21ab0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
21ac0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
21ad0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
21ae0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
21af0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
21b00 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
21b10 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
21b20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
21b30 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
21b40 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
21b50 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
21b60 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
21b70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
21b80 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
21b90 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
21ba0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
21bb0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
21bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
21bd0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
21be0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
21bf0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
21c00 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
21c10 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c30 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
21c40 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
21c50 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c70 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
21c80 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
21c90 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
21ca0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
21cb0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
21cc0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
21cd0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
21ce0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21d00 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
21d10 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
21d20 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
21d30 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d50 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
21d60 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
21d90 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
21da0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
21db0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
21dc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21dd0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
21de0 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
21df0 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
21e00 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
21e10 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
21e20 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
21e30 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
21e40 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
21e50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
21e60 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
21e70 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
21e80 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
21e90 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
21ea0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
21eb0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
21ec0 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
21ed0 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
21ee0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
21ef0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
21f00 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
21f10 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
21f20 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
21f30 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
21f40 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
21f50 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
21f60 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
21f70 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
21f80 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
21f90 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
21fa0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
21fb0 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
21fc0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
21fd0 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
21fe0 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
21ff0 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
22000 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
22010 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  os..  */.  if( (
22020 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20  !pPage && (rc = 
22030 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
22040 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
22050 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20  &pPage, 0))).   
22060 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72  ||            (r
22070 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22080 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
22090 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Page)).  ){.    
220a0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
220b0 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  t;.  }.  memset(
220c0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
220d0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
220e0 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
220f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
22100 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
22110 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
22120 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
22130 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
22140 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
22150 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
22160 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
22170 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
22180 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
22190 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
221a0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
221b0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
221c0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
221d0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
221e0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
221f0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
22200 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
22210 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
22220 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
22230 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
22240 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
22250 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
22260 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
22270 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
22280 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
22290 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
222a0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
222b0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
222c0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
222d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
222e0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
222f0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
22300 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
22310 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
22320 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
22330 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
22340 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
22350 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
22360 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
22370 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
22380 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
22390 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66  ){.    int nLeaf
223a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
223b0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
223c0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
223d0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
223e0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
223f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
22400 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
22410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22420 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
22430 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
22440 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
22450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22460 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
22470 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
22480 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
22490 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
224a0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  a[4]);.    if( n
224b0 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20 20  Leaf<0 ){.      
224c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
224d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
224e0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
224f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
22500 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62   nLeaf<pBt->usab
22510 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
22520 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
22530 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
22540 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
22550 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
22560 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
22570 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
22580 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
22590 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
225a0 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
225b0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
225c0 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
225d0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
225e0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
225f0 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
22600 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
22610 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
22620 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
22630 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
22640 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
22650 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
22660 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
22670 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
22680 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
22690 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
226a0 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
226b0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
226c0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
226d0 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
226e0 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
226f0 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
22700 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
22710 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
22720 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
22730 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
22740 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
22750 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
22760 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63  ntain to restric
22770 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
22780 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
22790 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
227a0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
227b0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
227c0 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
227d0 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
227e0 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
227f0 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
22800 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
22810 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
22820 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
22830 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
22840 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
22850 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
22860 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
22870 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
22880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22890 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
228a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
228b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
228c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
228d0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
228e0 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
228f0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
22900 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
22910 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
22920 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  Page);.#ifndef S
22930 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
22940 45 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  ETE.        if( 
22950 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
22960 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
22970 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
22980 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
22990 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
229a0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
229b0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
229c0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
229d0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
229e0 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
229f0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
22a00 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
22a10 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
22a20 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
22a30 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
22a40 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
22a50 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
22a60 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
22a70 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
22a80 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
22a90 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
22aa0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
22ab0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
22ac0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
22ad0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
22ae0 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
22af0 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
22b00 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
22b10 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
22b20 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
22b30 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
22b40 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
22b50 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
22b60 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
22b70 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
22b80 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
22b90 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
22ba0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
22bb0 20 20 69 66 28 20 20 20 28 28 21 70 50 61 67 65    if(   ((!pPage
22bc0 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
22bd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
22be0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
22bf0 20 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a 20   &pPage, 0)))). 
22c00 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63      || (0 != (rc
22c10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
22c20 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
22c30 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  age))).  ){.    
22c40 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
22c50 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
22c60 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
22c70 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
22c80 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
22c90 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
22ca0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
22cb0 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
22cc0 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
22cd0 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
22ce0 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
22cf0 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
22d00 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
22d10 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
22d20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
22d30 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
22d40 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
22d50 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
22d60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
22d70 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
22d80 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
22d90 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
22da0 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
22db0 72 6e 20 66 72 65 65 50 61 67 65 32 28 70 50 61  rn freePage2(pPa
22dc0 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
22dd0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  pPage->pgno);.}.
22de0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
22df0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
22e00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
22e10 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
22e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
22e30 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
22e40 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
22e50 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
22e60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22e70 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
22e80 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
22e90 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
22ea0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
22eb0 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50  vfl;.  u16 ovflP
22ec0 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
22ed0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22ee0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
22ef0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
22f00 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
22f10 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
22f20 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
22f30 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
22f40 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
22f50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
22f60 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
22f70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
22f80 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
22f90 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
22fa0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
22fb0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
22fc0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
22fd0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
22fe0 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
22ff0 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
23000 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
23010 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
23020 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
23030 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
23040 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
23050 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
23060 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
23070 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
23080 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
23090 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
230a0 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
230b0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
230c0 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d    if( ovflPgno==
230d0 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61  0 || ovflPgno>pa
230e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
230f0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
23100 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
23110 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
23120 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
23130 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
23140 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
23150 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
23160 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
23170 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
23180 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
23190 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
231a0 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
231b0 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  );.    if( pOvfl
231c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
231d0 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
231e0 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
231f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
23200 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
23210 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
23220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
23230 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23240 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
23250 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
23260 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
23270 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
23280 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
23290 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
232a0 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
232b0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
232c0 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
232d0 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
232e0 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
232f0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
23300 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
23310 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
23320 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
23330 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
23340 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
23350 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
23360 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
23370 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
23380 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
23390 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
233a0 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
233b0 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
233c0 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
233d0 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
233e0 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
233f0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
23400 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
23410 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
23420 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
23430 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
23440 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
23450 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
23460 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
23470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
23480 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
23490 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
234a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
234b0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
234c0 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
234d0 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
234e0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
234f0 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
23500 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
23510 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
23520 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
23530 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
23540 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23560 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
23570 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
23580 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
23590 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
235a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
235b0 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
235c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
235d0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
235e0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
235f0 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
23600 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
23610 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
23620 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
23630 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
23640 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
23650 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
23660 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
23670 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
23680 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
23690 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
236a0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
236b0 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
236c0 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
236d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
236e0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
236f0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
23700 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
23710 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
23720 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
23730 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
23740 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
23750 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
23760 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
23770 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
23780 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
23790 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
237a0 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
237b0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
237c0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
237d0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
237e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
237f0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
23800 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
23810 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
23820 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66  Header = 0;.  if
23830 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
23840 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
23850 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   4;.  }.  if( pP
23860 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
23870 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
23880 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
23890 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b  nHeader], nData+
238a0 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  nZero);.  }else{
238b0 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65  .    nData = nZe
238c0 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48  ro = 0;.  }.  nH
238d0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
238e0 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
238f0 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
23900 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
23910 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
23920 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
23930 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  o);.  assert( in
23940 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61  fo.nHeader==nHea
23950 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
23960 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
23970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
23980 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28  fo.nData==(u32)(
23990 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a  nData+nZero) );.
239a0 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
239b0 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
239c0 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
239d0 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
239e0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
239f0 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
23a00 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
23a10 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
23a20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
23a30 20 20 20 69 66 28 20 6e 4b 65 79 3e 30 78 37 66     if( nKey>0x7f
23a40 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
23a50 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
23a60 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
23a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
23a80 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65  load += (int)nKe
23a90 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
23aa0 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
23ab0 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
23ac0 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
23ad0 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
23ae0 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
23af0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
23b00 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
23b10 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
23b20 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
23b30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
23b40 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
23b50 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
23b60 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
23b70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
23b80 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
23b90 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
23ba0 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
23bb0 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
23bc0 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
23bd0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
23be0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
23bf0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
23c00 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
23c10 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
23c20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
23c30 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
23c40 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
23c50 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
23c60 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
23c70 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65     );.      }.#e
23c80 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
23c90 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
23ca0 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
23cb0 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
23cc0 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  fl, 0);.#ifndef 
23cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
23ce0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
23cf0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
23d00 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
23d10 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
23d20 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
23d30 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
23d40 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
23d50 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
23d60 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
23d70 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
23d80 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
23d90 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
23da0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
23db0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
23dc0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
23dd0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
23de0 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
23df0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
23e00 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
23e10 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
23e20 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
23e30 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
23e40 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
23e50 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
23e60 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
23e70 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
23e80 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
23e90 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
23ea0 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73  itialised values
23eb0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
23ec0 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
23ed0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
23ee0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
23ef0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
23f00 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63  autoVacuum && rc
23f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23f20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20         u8 eType 
23f30 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54  = (pgnoPtrmap?PT
23f40 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50  RMAP_OVERFLOW2:P
23f50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29  TRMAP_OVERFLOW1)
23f60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
23f70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
23f80 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
23f90 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20  gnoPtrmap);.    
23fa0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
23fb0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
23fc0 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
23fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
23fe0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
23ff0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
24000 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
24010 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
24020 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
24030 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54  ..      /* If pT
24040 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
24050 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72  zero than pPrior
24060 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
24070 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20   data area.     
24080 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
24090 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
240a0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
240b0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
240c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
240d0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
240e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
240f0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
24100 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
24110 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69        /* If pPri
24120 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  or is part of th
24130 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
24140 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
24150 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20  sure pPage.     
24160 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
24170 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  teable */.      
24180 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70  assert( pPrior<p
24190 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
241a0 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61  Prior>=&pPage->a
241b0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
241c0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
241d0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
241e0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
241f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
24200 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
24210 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
24220 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
24230 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
24240 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
24250 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
24260 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
24270 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
24280 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
24290 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
242a0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
242b0 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
242c0 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
242d0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
242e0 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
242f0 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
24300 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
24310 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a  aceLeft;..    /*
24320 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
24330 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
24340 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20  pPayload points 
24350 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
24360 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  ea.    ** of pTo
24370 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
24380 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
24390 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
243a0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
243b0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
243c0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
243d0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
243e0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
243f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50  );..    /* If pP
24400 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f  ayload is part o
24410 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
24420 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
24430 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
24440 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
24450 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
24460 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64  assert( pPayload
24470 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
24480 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67   pPayload>=&pPag
24490 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
244a0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
244b0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
244c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
244d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
244e0 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  ;..    if( nSrc>
244f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
24500 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63  >nSrc ) n = nSrc
24510 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24520 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65  pSrc );.      me
24530 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
24540 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
24550 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
24560 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
24570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
24580 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
24590 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
245a0 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
245b0 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
245c0 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
245d0 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
245e0 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
245f0 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
24600 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
24610 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
24620 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
24630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24640 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
24650 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
24660 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
24670 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
24680 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
24690 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
246a0 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
246b0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
246c0 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
246d0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
246e0 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
246f0 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
24700 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
24710 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
24720 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
24730 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
24740 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
24750 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
24760 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
24770 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
24780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
24790 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
247a0 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
247b0 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20   int sz){.  int 
247c0 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
247d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
247e0 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
247f0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
24800 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
24810 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
24820 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
24830 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
24840 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
24850 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
24860 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
24870 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
24880 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
24890 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
248a0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
248b0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
248c0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
248d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
248e0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
248f0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
24900 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24910 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
24920 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
24930 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
24940 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
24950 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
24960 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
24970 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
24980 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
24990 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
249a0 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
249b0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
249c0 20 69 66 28 20 28 70 63 3c 70 50 61 67 65 2d 3e   if( (pc<pPage->
249d0 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61  hdrOffset+6+(pPa
249e0 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 29 0a 20  ge->leaf?0:4)). 
249f0 20 20 20 20 7c 7c 20 28 70 63 2b 73 7a 3e 70 50      || (pc+sz>pP
24a00 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
24a10 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Size) ){.    ret
24a20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24a30 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
24a40 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
24a50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
24a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24a70 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
24a80 72 63 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rc;.  }.  for(i=
24a90 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e  idx+1; i<pPage->
24aa0 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b  nCell; i++, ptr+
24ab0 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20  =2){.    ptr[0] 
24ac0 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74  = ptr[2];.    pt
24ad0 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20  r[1] = ptr[3];. 
24ae0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
24af0 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l--;.  put2byte(
24b00 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
24b10 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
24b20 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  ->nCell);.  pPag
24b30 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
24b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24b50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
24b60 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
24b70 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
24b80 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
24b90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
24ba0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
24bb0 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
24bc0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
24bd0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
24be0 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
24bf0 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
24c00 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
24c10 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
24c20 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
24c30 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
24c40 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
24c50 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
24c60 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
24c70 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
24c80 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
24c90 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  e->aOvfl[] and m
24ca0 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
24cb0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
24cc0 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
24cd0 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
24ce0 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
24cf0 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
24d00 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
24d10 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
24d20 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
24d30 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
24d40 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
24d50 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
24d60 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
24d70 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
24d80 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
24d90 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
24da0 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
24db0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
24dc0 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
24dd0 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
24de0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
24df0 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
24e00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
24e10 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
24e20 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
24e30 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
24e40 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
24e50 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
24e60 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
24e70 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74  tatic int insert
24e80 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
24e90 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
24ea0 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
24eb0 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
24ec0 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
24ed0 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
24ee0 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
24ef0 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
24f00 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
24f10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
24f20 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
24f30 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
24f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
24f50 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
24f60 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
24f70 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
24f80 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
24f90 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
24fa0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38  f needed */.  u8
24fb0 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   nSkip          
24fc0 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  /* Do not write 
24fd0 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
24fe0 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
24ff0 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  l */.){.  int id
25000 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  x;          /* W
25010 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
25020 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
25030 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
25040 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
25050 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
25060 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
25070 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25080 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  byte of content 
25090 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20  for any cell in 
250a0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
250b0 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
250c0 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
250d0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
250e0 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
250f0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
25100 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
25110 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
25120 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
25130 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
25140 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
25150 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
25160 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68  nto data[] of th
25170 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
25180 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
25190 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
251a0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
251b0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
251c0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
251d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
251e0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
251f0 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
25200 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
25210 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
25220 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
25230 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
25240 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  /..  assert( i>=
25250 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
25260 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
25270 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
25280 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
25290 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
252a0 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
252b0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
252c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
252d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
252e0 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
252f0 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  ->aOvfl) );.  as
25300 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
25310 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
25320 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
25330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25340 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
25350 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
25360 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
25370 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
25380 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
25390 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
253a0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
253b0 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
253c0 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
253d0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
253e0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
253f0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
25400 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
25410 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
25420 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
25430 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
25440 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
25450 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
25460 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
25470 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
25480 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  dx = (u16)i;.   
25490 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
254a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
254b0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
254c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
254d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
254e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
254f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
25500 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
25510 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
25520 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
25530 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
25540 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
25550 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
25560 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
25570 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
25580 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
25590 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
255a0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
255b0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
255c0 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
255d0 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
255e0 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
255f0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
25600 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
25610 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
25620 20 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67       rc = defrag
25630 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
25640 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
25650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25660 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
25670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 6f 70       }.      top
25680 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
25690 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
256a0 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
256b0 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
256c0 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
256d0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
256e0 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
256f0 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
25700 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
25710 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
25720 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69 66 20 28  +5]) );.    if (
25730 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e  idx+sz > pPage->
25740 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
25750 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
25760 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25770 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
25780 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
25790 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
257a0 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
257b0 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
257c0 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
257d0 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
257e0 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
257f0 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
25800 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
25810 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
25820 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
25830 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
25840 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
25850 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
25860 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
25870 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
25880 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
25890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
258a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
258b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
258c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
258d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
258e0 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
258f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
25900 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
25910 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
25920 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
25930 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
25940 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
25950 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
25960 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  /.      CellInfo
25970 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c   info;.      sql
25980 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
25990 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
259a0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
259b0 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
259c0 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
259d0 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
259e0 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
259f0 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  d );.      if( (
25a00 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
25a10 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
25a20 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
25a30 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50  cal ){.        P
25a40 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
25a50 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
25a60 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
25a70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
25a80 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
25a90 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  Bt, pgnoOvfl, PT
25aa0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
25ab0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
25ac0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
25ad0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
25ae0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
25af0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
25b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25b10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
25b20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
25b30 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
25b40 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
25b50 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
25b60 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
25b70 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
25b80 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
25b90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
25ba0 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
25bb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
25bc0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
25bd0 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
25be0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
25bf0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
25c00 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
25c10 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
25c20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
25c30 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
25c40 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
25c50 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
25c60 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
25c70 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
25c80 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
25c90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
25ca0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
25cb0 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20  t totalSize;    
25cc0 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
25cd0 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20   all cells */.  
25ce0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
25cf0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61    /* Index of pa
25d00 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
25d10 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20  nt cellptr;     
25d20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
25d30 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
25d40 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
25d50 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
25d60 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
25d70 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61  body */.  u8 *da
25d80 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ta;         /* D
25d90 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
25da0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
25db0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
25dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25dd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
25de0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
25df0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
25e00 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e  t( nCell>=0 && n
25e10 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
25e20 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f  age->pBt) && MX_
25e30 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
25e40 3c 3d 35 34 36 30 20 29 3b 0a 20 20 74 6f 74 61  <=5460 );.  tota
25e50 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72  lSize = 0;.  for
25e60 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
25e70 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69  ++){.    totalSi
25e80 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  ze += aSize[i];.
25e90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f    }.  assert( to
25ea0 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c  talSize+2*nCell<
25eb0 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b  =pPage->nFree );
25ec0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25ed0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
25ee0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
25ef0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
25f00 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
25f10 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70  );.  cellptr = p
25f20 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
25f30 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
25f40 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
25f50 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
25f60 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  t;.  put2byte(&d
25f70 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c  ata[hdr+3], nCel
25f80 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20  l);.  if( nCell 
25f90 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  ){.    cellbody 
25fa0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
25fb0 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65  pPage, totalSize
25fc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  );.    assert( c
25fd0 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20  ellbody>0 );.   
25fe0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
25ff0 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c  nFree >= 2*nCell
26000 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
26010 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b  Free -= 2*nCell;
26020 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26030 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
26040 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
26050 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c  a[cellptr], cell
26060 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d  body);.      mem
26070 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
26080 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
26090 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20  aSize[i]);.     
260a0 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20   cellptr += 2;. 
260b0 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d       cellbody +=
260c0 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d   aSize[i];.    }
260d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c  .    assert( cel
260e0 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42  lbody==pPage->pB
260f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
26100 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
26110 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c  ell = (u16)nCell
26120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
26130 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
26140 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
26150 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
26160 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
26170 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
26180 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
26190 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
261a0 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
261b0 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
261c0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
261d0 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
261e0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
261f0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
26200 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
26210 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
26220 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
26230 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
26240 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
26250 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
26260 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
26270 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
26280 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
26290 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
262a0 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
262b0 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
262c0 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
262d0 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
262e0 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
262f0 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
26300 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
26310 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
26320 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
26330 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
26340 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
26350 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
26360 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
26370 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
26380 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
26390 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
263a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
263b0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
263c0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
263d0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
263e0 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
263f0 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
26400 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
26410 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  ance */../* Forw
26420 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
26430 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
26440 6e 63 65 28 42 74 43 75 72 73 6f 72 2a 2c 20 69  nce(BtCursor*, i
26450 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nt);..#ifndef SQ
26460 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
26470 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
26480 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
26490 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
264a0 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
264b0 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
264c0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
264d0 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
264e0 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
264f0 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
26500 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
26510 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
26520 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
26530 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
26540 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
26550 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
26560 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
26570 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
26580 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
26590 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
265a0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
265b0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
265c0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
265d0 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
265e0 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
265f0 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
26600 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
26610 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
26620 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
26630 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
26640 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
26650 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
26660 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
26670 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
26680 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
26690 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
266a0 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
266b0 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
266c0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
266d0 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
266e0 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
266f0 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
26700 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
26710 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
26720 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
26730 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
26740 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
26750 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
26760 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
26770 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
26780 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
26790 65 5f 71 75 69 63 6b 28 42 74 43 75 72 73 6f 72  e_quick(BtCursor
267a0 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
267b0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  c;.  MemPage *pN
267c0 65 77 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 70  ew = 0;.  Pgno p
267d0 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43  gnoNew;.  u8 *pC
267e0 65 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c  ell;.  u16 szCel
267f0 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  l;.  CellInfo in
26800 66 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  fo;.  MemPage *p
26810 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
26820 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26830 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
26840 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
26850 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
26860 31 5d 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  1];.  BtShared *
26870 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
26880 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64  ;.  int parentId
26890 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  x = pParent->nCe
268a0 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74  ll;   /* pParent
268b0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
268c0 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
268d0 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20   parentSize;    
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
268f0 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69  * Size of new di
26900 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
26910 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34  u8 parentCell[64
26920 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
26930 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74    /* Space for t
26940 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
26950 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ell */..  assert
26960 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
26970 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
26980 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
26990 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
269a0 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65  page. Insert the
269b0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
269c0 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69  rom pPage.  ** i
269d0 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d  nto it. Then rem
269e0 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ove the overflow
269f0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
26a00 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
26a10 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
26a20 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
26a30 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69  oNew, 0, 0);.  i
26a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26a50 20 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   ){.    pCell = 
26a60 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
26a70 70 43 65 6c 6c 3b 0a 20 20 20 20 73 7a 43 65 6c  pCell;.    szCel
26a80 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
26a90 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
26aa0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26ab0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26ac0 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
26ad0 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
26ae0 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61  e(pNew, pPage->a
26af0 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73  Data[0]);.    as
26b00 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
26b10 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43   1, &pCell, &szC
26b20 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
26b30 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
26b40 20 20 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 20    .    /* pPage 
26b50 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
26b60 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
26b70 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20  pParent. Change 
26b80 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 6f 20 74  this.    ** so t
26b90 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  hat the right-ch
26ba0 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70  ild is the new p
26bb0 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62  age allocated ab
26bc0 6f 76 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70  ove and.    ** p
26bd0 50 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74  Page is the next
26be0 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e  -to-right child.
26bf0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
26c00 49 67 6e 6f 72 65 20 74 68 65 20 72 65 74 75 72  Ignore the retur
26c10 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  n value of the c
26c20 61 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c  all to fillInCel
26c30 6c 28 29 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  l(). fillInCell(
26c40 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c  ).    ** may onl
26c50 79 20 72 65 74 75 72 6e 20 6f 74 68 65 72 20 74  y return other t
26c60 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
26c70 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64 20   it is required 
26c80 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20  to allocate.    
26c90 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  ** one or more o
26ca0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 53  verflow pages. S
26cb0 69 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c  ince an internal
26cc0 20 74 61 62 6c 65 20 42 2d 54 72 65 65 20 63 65   table B-Tree ce
26cd0 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ll .    ** may n
26ce0 65 76 65 72 20 73 70 69 6c 6c 20 6f 76 65 72 20  ever spill over 
26cf0 6f 6e 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  onto an overflow
26d00 20 70 61 67 65 20 28 69 74 20 69 73 20 61 20 6d   page (it is a m
26d10 61 78 69 6d 75 6d 20 6f 66 20 0a 20 20 20 20 2a  aximum of .    *
26d20 2a 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  * 13 bytes in si
26d30 7a 65 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e  ze), it is not n
26d40 65 63 63 65 73 73 61 72 79 20 74 6f 20 63 68 65  eccessary to che
26d50 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
26d60 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
26d70 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  * Similarly, the
26d80 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75   insertCell() fu
26d90 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
26da0 69 6c 20 69 66 20 74 68 65 20 70 61 67 65 0a 20  il if the page. 
26db0 20 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65     ** being inse
26dc0 72 74 65 64 20 69 6e 74 6f 20 69 73 20 61 6c 72  rted into is alr
26dd0 65 61 64 79 20 77 72 69 74 61 62 6c 65 20 61 6e  eady writable an
26de0 64 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  d the cell does 
26df0 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  not .    ** cont
26e00 61 69 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ain an overflow 
26e10 70 6f 69 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f  pointer. So igno
26e20 72 65 20 74 68 69 73 20 72 65 74 75 72 6e 20 63  re this return c
26e30 6f 64 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ode too..    */.
26e40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26e50 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
26e60 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
26e70 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
26e80 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 73  >nCell-1);.    s
26e90 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
26ea0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
26eb0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
26ec0 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61    fillInCell(pPa
26ed0 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c  rent, parentCell
26ee0 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
26ef0 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74  0, 0, 0, &parent
26f00 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
26f10 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34  t( parentSize<64
26f20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26f30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
26f40 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
26f50 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
26f60 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
26f70 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20  ent, parentIdx, 
26f80 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65  parentCell, pare
26f90 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20  ntSize, 0, 4);. 
26fa0 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
26fb0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
26fc0 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c  rent,parentIdx),
26fd0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
26fe0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
26ff0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
27000 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
27010 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a  ], pgnoNew);.  .
27020 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
27030 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
27040 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
27050 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
27060 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e  p.    ** with en
27070 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
27080 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
27090 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
270a0 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
270b0 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
270c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
270d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
270e0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
270f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
27100 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
27110 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
27120 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
27130 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27150 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
27160 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20  Ovfl(pNew, 0);. 
27170 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
27180 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
27190 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
271a0 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
271b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
271c0 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  New);.  }..  /* 
271d0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
271e0 65 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 76  e pPage->nFree v
271f0 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73  ariable is not s
27200 65 74 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74  et correctly wit
27210 68 0a 20 20 2a 2a 20 72 65 73 70 65 63 74 20 74  h.  ** respect t
27220 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  o the content of
27230 20 74 68 65 20 70 61 67 65 20 28 62 65 63 61 75   the page (becau
27240 73 65 20 69 74 20 77 61 73 20 73 65 74 20 74 6f  se it was set to
27250 20 30 20 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65   0 by .  ** inse
27260 72 74 43 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c  rtCell). So call
27270 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
27280 74 50 61 67 65 28 29 20 74 6f 20 6d 61 6b 65 20  tPage() to make 
27290 73 75 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  sure it is.  ** 
272a0 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20  correct..  **.  
272b0 2a 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62  ** This has to b
272c0 65 20 64 6f 6e 65 20 65 76 65 6e 20 69 66 20 61  e done even if a
272d0 6e 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  n error will be 
272e0 72 65 74 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c  returned. Normal
272f0 6c 79 2c 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65  ly, if.  ** an e
27300 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
27310 6e 67 20 74 72 65 65 20 62 61 6c 61 6e 63 69 6e  ng tree balancin
27320 67 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  g, the contents 
27330 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65 0a 20  of MemPage are. 
27340 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   ** not importan
27350 74 2c 20 61 73 20 74 68 65 79 20 77 69 6c 6c 20  t, as they will 
27360 62 65 20 72 65 63 61 6c 63 75 6c 61 74 65 64 20  be recalculated 
27370 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  when the page is
27380 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
27390 6b 2e 20 42 75 74 20 68 65 72 65 2c 20 69 6e 20  k. But here, in 
273a0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c  balance_quick(),
273b0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
273c0 74 68 61 74 20 70 50 61 67 65 20 68 61 73 20 0a  that pPage has .
273d0 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65    ** not yet bee
273e0 6e 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 6f  n marked dirty o
273f0 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  r written into t
27400 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
27410 20 54 68 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20   Therefore.  ** 
27420 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72  it will not be r
27430 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 73  olled back and s
27440 6f 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  o it is importan
27450 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
27460 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  hat.  ** the pag
27470 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 74 65  e data and conte
27480 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61  nts of MemPage a
27490 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  re consistent.. 
274a0 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   */.  pPage->isI
274b0 6e 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  nit = 0;.  sqlit
274c0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
274d0 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  pPage);.  assert
274e0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
274f0 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ow==0 );..  /* I
27500 66 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  f everything els
27510 65 20 73 75 63 63 65 65 64 65 64 2c 20 62 61 6c  e succeeded, bal
27520 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
27530 70 61 67 65 2c 20 69 6e 20 0a 20 20 2a 2a 20 63  page, in .  ** c
27540 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72 20  ase the divider 
27550 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61  cell inserted ca
27560 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d  used it to becom
27570 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f  e overfull..  */
27580 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
275a0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
275b0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
275c0 2d 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  -;.    rc = bala
275d0 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  nce(pCur, 0);.  
275e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
275f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
27600 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
27610 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NCE */../*.** Th
27620 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
27630 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f  tributes Cells o
27640 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
27650 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a  o NN*2 siblings.
27660 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74  ** of pPage so t
27670 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
27680 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d  ve about the sam
27690 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
276a0 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c   space..** Usual
276b0 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  ly NN siblings o
276c0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
276d0 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69   pPage is used i
276e0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
276f0 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20  .** though more 
27700 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
27710 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ome from one sid
27720 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  e if pPage is th
27730 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61  e first.** or la
27740 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
27750 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67  parent.  If pPag
27760 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e  e has fewer than
27770 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a   2*NN siblings.*
27780 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  * (something whi
27790 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
277a0 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74  en if pPage is t
277b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20  he root page or 
277c0 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72  a .** child of r
277d0 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  oot) then all av
277e0 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
277f0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
27800 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
27810 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
27820 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  of siblings of p
27830 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  Page might be in
27840 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
27850 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a  ased by one or.*
27860 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  * two in an effo
27870 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
27880 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
27890 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
278a0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  The root page.**
278b0 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20   is special and 
278c0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
278d0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49   nearly empty. I
278e0 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74  f pPage is .** t
278f0 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  he root page, th
27900 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  en the depth of 
27910 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62  the tree might b
27920 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f  e increased.** o
27930 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
27940 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79  ne, as necessary
27950 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f  , to keep the ro
27960 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  ot page from bei
27970 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f  ng.** overfull o
27980 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  r completely emp
27990 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ty..**.** Note t
279a0 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
279b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
279c0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c   some of the Cel
279d0 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d  ls on pPage.** m
279e0 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
279f0 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
27a00 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20  Page->aData[].  
27a10 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
27a20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
27a30 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72  s overfull.  Par
27a40 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20  t of the job of 
27a50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
27a60 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20  to.** make sure 
27a70 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50  all Cells for pP
27a80 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66  age once again f
27a90 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  it in pPage->aDa
27aa0 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ta[]..**.** In t
27ab0 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
27ac0 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69  ancing the sibli
27ad0 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68  ngs of pPage, th
27ae0 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
27af0 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d  e.** might becom
27b00 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
27b10 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61  derfull.  If tha
27b20 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20  t happens, then 
27b30 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
27b40 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
27b50 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72  ively on the par
27b60 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
27b70 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
27b80 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
27b90 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
27ba0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
27bb0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
27bc0 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69  tate.  So if thi
27bd0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
27be0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
27bf0 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
27c00 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
27c10 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
27c20 6e 72 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  nroot(BtCursor *
27c30 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
27c40 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
27c50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 76 65        /* The ove
27c60 72 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 70  r or underfull p
27c70 61 67 65 20 74 6f 20 62 61 6c 61 6e 63 65 20 2a  age to balance *
27c80 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
27c90 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
27ca0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
27cb0 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53  f pPage */.  BtS
27cc0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
27cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27ce0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
27cf0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
27d00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27d10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
27d20 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
27d30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
27d40 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
27d50 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
27d60 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
27d70 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
27d80 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 20 3d 20 30  /.  int nOld = 0
27d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27da0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
27db0 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
27dc0 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  /.  int nNew = 0
27dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27de0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
27df0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
27e00 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20  /.  int nDiv;   
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
27e30 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a  lls in apDiv[] *
27e40 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
27e70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  s */.  int idx; 
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
27ea0 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74  pPage in pParent
27eb0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
27ec0 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27ee0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
27ef0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
27f00 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
27f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27f20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
27f30 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
27f40 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
27f50 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
27f60 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
27f70 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
27f80 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
27f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27fa0 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
27fb0 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
27fc0 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
27fd0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
27fe0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
27ff0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
28000 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
28010 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
28020 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
28030 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
28040 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
28050 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
28060 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
28070 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
28080 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
28090 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
280a0 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
280b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
280c0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
280d0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
280e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  [] */.  int iSpa
280f0 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce2 = 0;        
28100 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
28110 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
28120 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace2[] */.  int 
28130 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
28140 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
28150 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
28160 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
28170 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
28180 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
28190 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
281a0 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
281b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64  /.  Pgno pgnoOld
281c0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
281d0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
281e0 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
281f0 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d  n apOld[] */.  M
28200 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
28210 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
28220 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
28230 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
28240 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
28250 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
28260 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
28270 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
28280 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
28290 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
282a0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
282b0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
282c0 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  s for each page 
282d0 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
282e0 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20  u8 *apDiv[NB];  
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28300 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
28310 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
28320 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
28330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28340 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
28350 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
28360 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
28370 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
28380 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
28390 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
283a0 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
283b0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
283c0 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
283d0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
283e0 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
283f0 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
28400 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
28410 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
28420 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
28430 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
28440 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b    u8 *aCopy[NB];
28450 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
28460 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61  e for holding da
28470 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a  ta of apCopy[] *
28480 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
28490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
284a0 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
284b0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
284c0 20 62 65 66 6f 72 65 20 62 61 6c 61 6e 63 65 20   before balance 
284d0 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 32  */.  u8 *aSpace2
284e0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53   = 0;       /* S
284f0 70 61 63 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f  pace for overflo
28500 77 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  w dividers cells
28510 20 61 66 74 65 72 20 62 61 6c 61 6e 63 65 20 2a   after balance *
28520 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20  /.  u8 *aFrom = 
28530 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
28540 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28550 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
28560 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28570 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
28580 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 56 56  ->mutex) );.  VV
28590 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61  A_ONLY( pCur->pa
285a0 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20  gesShuffled = 1 
285b0 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46  );..  /* .  ** F
285c0 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70  ind the parent p
285d0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
285e0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
285f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
28600 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
28610 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
28620 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
28630 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
28640 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ) || pPage->nOve
28650 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42  rflow==1 );.  pB
28660 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
28670 20 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72    pParent = pCur
28680 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28690 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72  Page-1];.  asser
286a0 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20  t( pParent );.  
286b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
286c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
286d0 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
286e0 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
286f0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
28700 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 54 52  eanup;.  }..  TR
28710 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
28720 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
28730 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
28740 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
28750 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e  t->pgno));..#ifn
28760 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28770 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f  QUICKBALANCE.  /
28780 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c  *.  ** A special
28790 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77   case:  If a new
287a0 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20   entry has just 
287b0 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
287c0 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20  to a.  ** table 
287d0 28 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65  (that is, a btre
287e0 65 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b  e with integer k
287f0 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  eys and all data
28800 20 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a   at the leaves).
28810 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77    ** and the new
28820 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69   entry is the ri
28830 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
28840 6e 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68  n the tree (it h
28850 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67  as the.  ** larg
28860 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73  est key) then us
28870 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61  e the special ba
28880 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f  lance_quick() ro
28890 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62  utine for.  ** b
288a0 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e  alancing.  balan
288b0 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75  ce_quick() is mu
288c0 63 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65  ch faster and re
288d0 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74  sults in a tight
288e0 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20  er.  ** packing 
288f0 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63  of data in the c
28900 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f  ommon case..  */
28910 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
28920 61 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  af &&.      pPag
28930 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20  e->intKey &&.   
28940 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
28950 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20  low==1 &&.      
28960 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
28970 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx==pPage->nCel
28980 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61 72 65  l &&.      pPare
28990 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20  nt->pgno!=1 &&. 
289a0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
289b0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
289c0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
289d0 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  +8])==pPage->pgn
289e0 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  o.  ){.    asser
289f0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
28a00 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   );.    /*.    *
28a10 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
28a20 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
28a30 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
28a40 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
28a50 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
28a60 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
28a70 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
28a80 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
28a90 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
28aa0 71 75 69 63 6b 28 70 43 75 72 29 3b 0a 20 20 7d  quick(pCur);.  }
28ab0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53  .#endif..  if( S
28ac0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
28ad0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28ae0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
28af0 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  )) ){.    goto b
28b00 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
28b10 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
28b20 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  ind the cell in 
28b30 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
28b40 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64  whose left child
28b50 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a   points back.  *
28b60 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65  * to pPage.  The
28b70 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20   "idx" variable 
28b80 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
28b90 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70  that cell.  If p
28ba0 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  Page.  ** is the
28bb0 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64   rightmost child
28bc0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e   of pParent then
28bd0 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72   set idx to pPar
28be0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f  ent->nCell .  */
28bf0 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  .  idx = pCur->a
28c00 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28c10 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 50 61 72  -1];.  assertPar
28c20 65 6e 74 49 6e 64 65 78 28 70 50 61 72 65 6e 74  entIndex(pParent
28c30 2c 20 69 64 78 2c 20 70 50 61 67 65 2d 3e 70 67  , idx, pPage->pg
28c40 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  no);..  /*.  ** 
28c50 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67  Find sibling pag
28c60 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20  es to pPage and 
28c70 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
28c80 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65  rent that divide
28c90 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e  .  ** the siblin
28ca0 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20  gs.  An attempt 
28cb0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
28cc0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
28cd0 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20  ither.  ** side 
28ce0 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20  of pPage.  More 
28cf0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
28d00 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
28d10 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20  , however, if.  
28d20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61  ** pPage there a
28d30 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
28d40 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
28d50 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66   other side.  If
28d60 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
28d70 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
28d80 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
28d90 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
28da0 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20  ent are taken.. 
28db0 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64   */.  nxDiv = id
28dc0 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78  x - NN;.  if( nx
28dd0 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65  Div + NB > pPare
28de0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
28df0 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74   nxDiv = pParent
28e00 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31  ->nCell - NB + 1
28e10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
28e20 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  v<0 ){.    nxDiv
28e30 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76   = 0;.  }.  nDiv
28e40 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 0;.  for(i=0,
28e50 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20   k=nxDiv; i<NB; 
28e60 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69  i++, k++){.    i
28e70 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43  f( k<pParent->nC
28e80 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44  ell ){.      apD
28e90 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
28ea0 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20  (pParent, k);.  
28eb0 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20      nDiv++;.    
28ec0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65    assert( !pPare
28ed0 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  nt->leaf );.    
28ee0 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
28ef0 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
28f00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
28f10 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65   k==pParent->nCe
28f20 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  ll ){.      pgno
28f30 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
28f40 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
28f50 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
28f60 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
28f70 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
28f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
28f90 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
28fa0 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c  pBt, pgnoOld[i],
28fb0 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20   &apOld[i]);.   
28fc0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
28fd0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
28fe0 20 20 20 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d      /* apOld[i]-
28ff0 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20  >idxParent = k; 
29000 2a 2f 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d  */.    apCopy[i]
29010 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
29020 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20  ( i==nOld );.   
29030 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61   nOld++;.    nMa
29040 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
29050 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
29060 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
29070 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
29080 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
29090 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
290a0 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
290b0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
290c0 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
290d0 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
290e0 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
290f0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
29100 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
29110 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
29120 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
29130 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
29140 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
29170 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
29180 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
291b0 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a 65    + (ROUND8(size
291c0 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42 74  of(MemPage))+pBt
291d0 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20 20  ->pageSize)*NB  
291e0 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
291f0 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29220 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
29230 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55    + (ISAUTOVACUU
29240 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20  M ? nMaxCells : 
29250 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0);             
29260 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70  /* aFrom */.  ap
29270 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
29280 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
29290 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
292a0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
292b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
292c0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
292d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
292e0 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
292f0 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
29300 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
29310 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
29320 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
29330 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
29340 30 5d 20 2d 20 28 75 38 2a 29 30 29 20 26 20 37  0] - (u8*)0) & 7
29350 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
29360 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
29370 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ired */.  for(i=
29380 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20  1; i<NB; i++){. 
29390 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61     aCopy[i] = &a
293a0 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70  Copy[i-1][pBt->p
293b0 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
293c0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
293d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
293e0 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29  aCopy[i] - (u8*)
293f0 30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  0) & 7)==0 ); /*
29400 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
29410 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
29420 7d 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61  }.  aSpace1 = &a
29430 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e  Copy[NB-1][pBt->
29440 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28  pageSize+ROUND8(
29450 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
29460 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
29470 53 70 61 63 65 31 20 2d 20 28 75 38 2a 29 30 29  Space1 - (u8*)0)
29480 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
29490 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
294a0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
294b0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
294c0 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61  {.    aFrom = &a
294d0 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
294e0 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70  Size];.  }.  aSp
294f0 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61  ace2 = sqlite3Pa
29500 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61  geMalloc(pBt->pa
29510 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61  geSize);.  if( a
29520 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20  Space2==0 ){.   
29530 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
29540 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
29550 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
29560 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  }.  .  /*.  ** M
29570 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
29580 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
29590 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
295a0 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
295b0 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
295c0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
295d0 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
295e0 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
295f0 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
29600 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
29610 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
29620 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
29630 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
29640 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
29650 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
29660 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
29670 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
29680 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
29690 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
296a0 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20  *)aCopy[i];.    
296b0 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b  memcpy(p, apOld[
296c0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
296d0 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61  ge));.    p->aDa
296e0 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31  ta = (void*)&p[1
296f0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
29700 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
29710 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
29720 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
29730 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
29740 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
29750 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
29760 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
29770 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
29780 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
29790 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
297a0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
297b0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
297c0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
297d0 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
297e0 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
297f0 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
29800 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
29810 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
29820 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
29830 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
29840 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
29850 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
29860 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
29870 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
29880 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
29890 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
298a0 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
298b0 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
298c0 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
298d0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
298e0 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
298f0 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
29900 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
29910 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
29920 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
29930 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
29940 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
29950 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
29960 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
29970 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
29980 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
29990 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
299a0 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
299b0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
299c0 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
299d0 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
299e0 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
299f0 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
29a00 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
29a10 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
29a20 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e  y keys..  */.  n
29a30 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66  Cell = 0;.  leaf
29a40 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61  Correction = pPa
29a50 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  ge->leaf*4;.  le
29a60 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  afData = pPage->
29a70 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
29a80 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
29a90 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
29aa0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b  Old = apCopy[i];
29ab0 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d  .    int limit =
29ac0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
29ad0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
29ae0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
29af0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
29b00 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
29b10 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
29b20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
29b30 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
29b40 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20  l(pOld, j);.    
29b50 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
29b60 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
29b70 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
29b80 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  ]);.      if( IS
29b90 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
29ba0 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
29bb0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
29bc0 5d 20 3d 20 28 75 38 29 69 3b 20 20 20 61 73 73  ] = (u8)i;   ass
29bd0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 36  ert( i>=0 && i<6
29be0 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
29bf0 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76  a=0; a<pOld->nOv
29c00 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20  erflow; a++){.  
29c10 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
29c20 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c  ->aOvfl[a].pCell
29c30 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  ==apCell[nCell] 
29c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
29c50 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
29c60 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF;.            
29c70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
29c80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29c90 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
29ca0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
29cb0 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20  ( i<nOld-1 ){.  
29cc0 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c      u16 sz = cel
29cd0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
29ce0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
29cf0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
29d00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69  ){.        /* Wi
29d10 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20  th the LEAFDATA 
29d20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65  flag, pParent ce
29d30 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e  lls hold only IN
29d40 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20  TKEYs that.     
29d50 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63     ** are duplic
29d60 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20  ates of keys on 
29d70 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e  the child pages.
29d80 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d    We need to rem
29d90 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ove.        ** t
29da0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
29db0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62   from pParent, b
29dc0 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20  ut the dividers 
29dd0 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20  cells are not.  
29de0 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
29df0 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75  o apCell[] becau
29e00 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c  se they are dupl
29e10 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20  icates of child 
29e20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  cells..        *
29e30 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  /.        dropCe
29e40 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
29e50 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65  v, sz);.      }e
29e60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20  lse{.        u8 
29e70 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20  *pTemp;.        
29e80 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
29e90 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
29ea0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
29eb0 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70   = sz;.        p
29ec0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
29ed0 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
29ee0 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
29ef0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29f00 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69   sz<=pBt->pageSi
29f10 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 20 20  ze/4 );.        
29f20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31 3c  assert( iSpace1<
29f30 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
29f40 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
29f50 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
29f60 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  , sz);.        a
29f70 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
29f80 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
29f90 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
29fa0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
29fb0 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d  .          aFrom
29fc0 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a  [nCell] = 0xFF;.
29fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29fe0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
29ff0 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
2a000 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a010 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2a020 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74  0 || leafCorrect
2a030 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
2a040 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2a050 2d 3d 20 28 75 31 36 29 6c 65 61 66 43 6f 72 72  -= (u16)leafCorr
2a060 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
2a070 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2a080 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64  (pTemp)==pgnoOld
2a090 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69  [i] );.        i
2a0a0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
2a0b0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2a0c0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
2a0d0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
2a0e0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2a0f0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
2a100 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
2a110 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
2a120 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
2a130 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
2a140 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
2a150 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
2a160 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
2a170 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68  d->aData[pOld->h
2a180 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b  drOffset+8], 4);
2a190 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2a1a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2a1b0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2a1c0 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==4 );.         
2a1d0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
2a1e0 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
2a1f0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
2a200 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
2a210 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
2a220 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
2a230 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2a240 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20   = 4;.          
2a250 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2a260 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
2a270 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2a280 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
2a290 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
2a2a0 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
2a2b0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
2a2c0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
2a2d0 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
2a2e0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
2a2f0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
2a300 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
2a310 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
2a320 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
2a330 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
2a340 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
2a350 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
2a360 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
2a370 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
2a380 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
2a390 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
2a3a0 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
2a3b0 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
2a3c0 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
2a3d0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
2a3e0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
2a3f0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
2a400 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2a410 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
2a420 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
2a430 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
2a440 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
2a450 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
2a460 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
2a470 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
2a480 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
2a490 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
2a4a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
2a4b0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
2a4c0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
2a4d0 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
2a4e0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
2a4f0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2a500 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
2a510 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
2a520 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
2a530 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
2a540 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
2a550 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
2a560 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
2a570 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
2a580 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
2a590 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2a5a0 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
2a5b0 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
2a5c0 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
2a5d0 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
2a5e0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
2a5f0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
2a600 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
2a610 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
2a620 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
2a630 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
2a640 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
2a650 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   k++;.    }.  }.
2a660 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
2a670 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
2a680 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
2a690 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
2a6a0 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
2a6b0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
2a6c0 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
2a6d0 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
2a6e0 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
2a6f0 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
2a700 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
2a710 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
2a720 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
2a730 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
2a740 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
2a750 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
2a760 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
2a770 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
2a780 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
2a790 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
2a7a0 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
2a7b0 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
2a7c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
2a7d0 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
2a7e0 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
2a7f0 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
2a800 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
2a810 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
2a820 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
2a830 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
2a840 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
2a850 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
2a860 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
2a870 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
2a880 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
2a890 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
2a8a0 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
2a8b0 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
2a8c0 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
2a8d0 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
2a8e0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
2a8f0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
2a900 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
2a910 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
2a920 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
2a930 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
2a940 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
2a950 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2a960 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
2a970 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
2a980 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a9a0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
2a9b0 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
2a9c0 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
2a9d0 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
2a9e0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
2a9f0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
2aa00 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
2aa10 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
2aa20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2aa30 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
2aa40 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
2aa50 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
2aa60 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
2aa70 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
2aa80 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
2aa90 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
2aaa0 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
2aab0 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
2aac0 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
2aad0 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
2aae0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
2aaf0 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
2ab00 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
2ab10 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
2ab20 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
2ab30 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
2ab40 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
2ab50 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
2ab60 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
2ab70 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
2ab80 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a  ) or we are the.
2ab90 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
2aba0 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
2abb0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
2abc0 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
2abd0 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
2abe0 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
2abf0 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
2ac00 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
2ac10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ac20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
2ac30 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
2ac40 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
2ac50 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
2ac60 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
2ac70 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
2ac80 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
2ac90 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
2aca0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2acb0 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
2acc0 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
2acd0 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
2ace0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
2acf0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
2ad00 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
2ad10 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
2ad20 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
2ad30 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
2ad40 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
2ad50 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
2ad60 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
2ad70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ad80 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
2ad90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
2ada0 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
2adb0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2adc0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
2add0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2ade0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
2adf0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2ae00 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
2ae10 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c  ew, &pgnoNew[i],
2ae20 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30   pgnoNew[i-1], 0
2ae30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2ae40 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2ae50 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
2ae60 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
2ae70 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
2ae80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
2ae90 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
2aea0 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
2aeb0 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
2aec0 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
2aed0 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
2aee0 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
2aef0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
2af00 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2af10 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
2af20 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
2af30 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
2af40 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
2af50 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2af60 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
2af70 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
2af80 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
2af90 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
2afa0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
2afb0 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
2afc0 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
2afd0 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
2afe0 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
2aff0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
2b000 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
2b010 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
2b020 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2b030 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
2b040 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
2b050 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
2b060 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
2b070 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
2b080 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
2b090 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
2b0a0 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
2b0b0 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
2b0c0 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
2b0d0 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
2b0e0 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
2b0f0 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
2b100 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
2b110 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
2b120 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
2b130 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
2b140 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
2b150 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
2b160 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
2b170 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2b180 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
2b190 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
2b1a0 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
2b1b0 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
2b1c0 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
2b1d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
2b1e0 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
2b1f0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
2b200 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
2b210 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
2b220 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
2b230 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2b240 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
2b250 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
2b260 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
2b270 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
2b280 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
2b290 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
2b2a0 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
2b2b0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
2b2c0 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
2b2d0 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
2b2e0 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
2b2f0 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
2b300 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
2b310 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2b320 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
2b330 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
2b340 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
2b350 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
2b360 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
2b370 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
2b380 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
2b390 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
2b3a0 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
2b3b0 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
2b3c0 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
2b3d0 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
2b3e0 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
2b3f0 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
2b400 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
2b410 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
2b420 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
2b430 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
2b440 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
2b450 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
2b460 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
2b470 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
2b480 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
2b490 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
2b4a0 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
2b4b0 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
2b4c0 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
2b4d0 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
2b4e0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
2b4f0 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
2b500 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
2b510 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
2b520 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
2b530 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
2b540 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
2b550 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
2b560 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
2b570 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
2b580 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
2b590 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
2b5a0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
2b5b0 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e   pNew->pgno==pgn
2b5c0 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a  oNew[i] );.    z
2b5d0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
2b5e0 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
2b5f0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
2b600 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
2b610 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
2b620 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
2b630 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
2b640 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
2b650 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
2b660 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2b670 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
2b680 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2b690 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2b6a0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2b6b0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2b6c0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
2b6d0 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
2b6e0 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
2b6f0 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
2b700 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
2b710 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
2b720 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
2b730 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
2b740 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
2b750 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
2b760 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
2b770 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
2b780 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2b790 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2b7a0 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e     for(k=j; k<cn
2b7b0 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20  tNew[i]; k++){. 
2b7c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b         assert( k
2b7d0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2b7e0 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b        if( aFrom[
2b7f0 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  k]==0xFF || apCo
2b800 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67  py[aFrom[k]]->pg
2b810 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
2b820 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2b830 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2b840 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20  New, k-j);.     
2b850 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b860 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 6f  ITE_OK && leafCo
2b870 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20  rrection==0 ){. 
2b880 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2b890 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
2b8a0 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 6b  et4byte(apCell[k
2b8b0 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
2b8c0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20  , pNew->pgno);. 
2b8d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b8e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2b8f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b900 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2b910 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2b920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b930 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2b940 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
2b950 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
2b960 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
2b970 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
2b980 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
2b990 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
2b9a0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
2b9b0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
2b9c0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2b9d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2b9e0 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c  ( i<nNew-1 && j<
2b9f0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
2ba00 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
2ba10 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
2ba20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
2ba30 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
2ba40 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
2ba50 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
2ba60 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
2ba70 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
2ba80 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
2ba90 6d 70 20 3d 20 26 61 53 70 61 63 65 32 5b 69 53  mp = &aSpace2[iS
2baa0 70 61 63 65 32 5d 3b 0a 20 20 20 20 20 20 69 66  pace2];.      if
2bab0 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
2bac0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2bad0 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
2bae0 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
2baf0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2bb00 43 55 55 4d 20 0a 20 20 20 20 20 20 20 20 20 26  CUUM .         &
2bb10 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46  & (aFrom[j]==0xF
2bb20 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
2bb30 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[j]]->pgno!=pNe
2bb40 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20 20  w->pgno).       
2bb50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2bb60 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2bb70 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
2bb80 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
2bb90 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
2bba0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2bbb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bbc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2bbd0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2bbe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bbf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2bc00 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2bc10 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2bc20 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
2bc30 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
2bc40 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2bc50 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
2bc60 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
2bc70 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
2bc80 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
2bc90 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
2bca0 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
2bcb0 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
2bcc0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
2bcd0 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
2bce0 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
2bcf0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
2bd00 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
2bd10 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
2bd20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2bd30 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
2bd40 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
2bd50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2bd60 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2bd70 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
2bd80 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
2bd90 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
2bda0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 69  .        rc = fi
2bdb0 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
2bdc0 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  , pCell, 0, info
2bdd0 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
2bde0 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &sz);.        if
2bdf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2be00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2be10 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2be20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2be30 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
2be40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2be50 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
2be60 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
2be70 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
2be80 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
2be90 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
2bea0 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
2beb0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
2bec0 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
2bed0 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
2bee0 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
2bef0 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
2bf00 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
2bf10 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
2bf20 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
2bf30 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
2bf40 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
2bf50 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
2bf60 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
2bf70 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
2bf80 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
2bf90 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
2bfa0 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
2bfb0 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
2bfc0 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
2bfd0 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
2bfe0 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
2bff0 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
2c000 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
2c010 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
2c020 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
2c030 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
2c040 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
2c050 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
2c060 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
2c070 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
2c080 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
2c090 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
2c0a0 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
2c0b0 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
2c0c0 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
2c0d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c0e0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
2c0f0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
2c100 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
2c110 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
2c120 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
2c130 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
2c140 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
2c150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c160 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20  Space2 += sz;.  
2c170 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
2c180 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
2c190 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2c1a0 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70   iSpace2<=pBt->p
2c1b0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
2c1c0 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2c1d0 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2c1e0 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
2c1f0 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 4);.      if(
2c200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c210 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2c220 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
2c230 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2c240 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2c250 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2c260 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2c270 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
2c280 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
2c290 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a  , pNew->pgno);..
2c2a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
2c2b0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2c2c0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  um database, and
2c2d0 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61   not a leaf-data
2c2e0 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20   tree,.      ** 
2c2f0 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20  then update the 
2c300 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68  pointer map with
2c310 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
2c320 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  e overflow page.
2c330 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
2c340 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65  e cell just inse
2c350 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28  rted points to (
2c360 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
2c370 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
2c380 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65 61  TOVACUUM && !lea
2c390 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
2c3a0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
2c3b0 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  vfl(pParent, nxD
2c3c0 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  iv);.        if(
2c3d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c3e0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2c3f0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2c400 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c410 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20    }.      j++;. 
2c420 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
2c430 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
2c440 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2c450 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
2c460 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
2c470 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2c480 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2c490 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2c4a0 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  pBt, pNew->pgno,
2c4b0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2c4c0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
2c4d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c4e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c4f0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2c500 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
2c510 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
2c520 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
2c530 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
2c540 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
2c550 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
2c560 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
2c570 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
2c580 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
2c590 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
2c5a0 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
2c5b0 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
2c5c0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
2c5d0 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20  ld, 4);.    if( 
2c5e0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2c5f0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2c600 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
2c610 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d  te(zChild), PTRM
2c620 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
2c630 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a  nNew-1]->pgno);.
2c640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c660 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2c670 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2c680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2c690 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2c6a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2c6b0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2c6c0 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70  ;.  if( nxDiv==p
2c6d0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50  Parent->nCell+pP
2c6e0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2c6f0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74   ){.    /* Right
2c700 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
2c710 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2c720 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
2c730 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2c740 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2c750 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2c760 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b  set+8], pgnoNew[
2c770 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73  nNew-1]);.  }els
2c780 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d  e{.    /* Right-
2c790 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20  most sibling is 
2c7a0 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f  the left child o
2c7b0 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  f the first entr
2c7c0 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20  y in pParent.   
2c7d0 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69 67   ** past the rig
2c7e0 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20  ht-most divider 
2c7f0 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74  entry */.    put
2c800 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2c810 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  owCell(pParent, 
2c820 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b  nxDiv), pgnoNew[
2c830 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20  nNew-1]);.  }.. 
2c840 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
2c850 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c860 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
2c870 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
2c880 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
2c890 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
2c8a0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2c8b0 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
2c8c0 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
2c8d0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
2c8e0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2c8f0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
2c900 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
2c910 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2c920 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
2c930 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
2c940 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70  ee(apCell);.  ap
2c950 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 54 52 41 43  Cell = 0;.  TRAC
2c960 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
2c970 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
2c980 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
2c990 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
2c9a0 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
2c9b0 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
2c9c0 6c 6c 29 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ll));.  pPage->n
2c9d0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
2c9e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2c9f0 65 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  e);.  pCur->iPag
2ca00 65 2d 2d 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61  e--;.  rc = bala
2ca10 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  nce(pCur, 0);.  
2ca20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
2ca30 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
2ca40 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
2ca50 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
2ca60 69 74 65 33 50 61 67 65 46 72 65 65 28 61 53 70  ite3PageFree(aSp
2ca70 61 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  ace2);.  sqlite3
2ca80 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
2ca90 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
2caa0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
2cab0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
2cac0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
2cad0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
2cae0 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
2caf0 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
2cb00 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 70 50  .  }.  pCur->apP
2cb10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2cb20 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
2cb30 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2cb40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2cb50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
2cb60 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
2cb70 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e   of a btree when
2cb80 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2cb90 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
2cba0 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e  lls.  This is an
2cbb0 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
2cbc0 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a  make the tree.**
2cbd0 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e   shallower by on
2cbe0 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  e level..*/.stat
2cbf0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73  ic int balance_s
2cc00 68 61 6c 6c 6f 77 65 72 28 42 74 43 75 72 73 6f  hallower(BtCurso
2cc10 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2cc20 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
2cc30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
2cc40 20 70 61 67 65 20 6f 66 20 42 2d 54 72 65 65 20   page of B-Tree 
2cc50 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
2cc60 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2cc70 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68    /* The only ch
2cc80 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67  ild page of pPag
2cc90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2cca0 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
2ccb0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2ccc0 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f  er for pChild */
2ccd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2cce0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2ccf0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
2cd00 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
2cd10 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  s */.  BtShared 
2cd20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
2cd30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2cd40 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75  in BTree structu
2cd50 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65  re */.  int mxCe
2cd60 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20  llPerPage;      
2cd70 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2cd80 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2cd90 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  per page */.  u8
2cda0 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20   **apCell;      
2cdb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2cdc0 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67  l cells from pag
2cdd0 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
2cde0 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
2cdf0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2ce00 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
2ce10 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
2ce20 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  /..  assert( pCu
2ce30 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20  r->iPage==0 );. 
2ce40 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2ce50 70 50 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73 73  pPage[0];..  ass
2ce60 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2ce70 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2ce80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2ce90 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2cea0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74  >mutex) );.  pBt
2ceb0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2cec0 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d   mxCellPerPage =
2ced0 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20   MX_CELL(pBt);. 
2cee0 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
2cef0 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50  3Malloc( mxCellP
2cf00 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
2cf10 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29  8*)+sizeof(u16))
2cf20 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
2cf30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2cf40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
2cf50 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
2cf60 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
2cf70 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
2cf80 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
2cf90 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
2cfa0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
2cfb0 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
2cfc0 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
2cfd0 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
2cfe0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
2cff0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
2d000 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
2d010 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
2d020 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
2d030 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2d040 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
2d050 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
2d060 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
2d070 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
2d080 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
2d090 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
2d0a0 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
2d0b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2d0c0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2d0d0 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
2d0e0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
2d0f0 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
2d100 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
2d110 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
2d120 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
2d130 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2d140 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
2d150 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
2d160 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
2d170 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
2d180 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
2d190 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
2d1a0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
2d1b0 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
2d1c0 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
2d1d0 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
2d1e0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
2d1f0 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
2d200 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
2d210 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
2d220 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
2d230 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
2d240 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
2d250 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
2d260 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
2d270 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
2d280 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 56  ee..    */.    V
2d290 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70  VA_ONLY( pCur->p
2d2a0 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31  agesShuffled = 1
2d2b0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   );.    pgnoChil
2d2c0 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
2d2d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2d2e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2d2f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2d300 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20  oChild>0 );.    
2d310 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
2d320 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  d<=pagerPagecoun
2d330 74 28 70 50 61 67 65 2d 3e 70 42 74 29 20 29 3b  t(pPage->pBt) );
2d340 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d350 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50  3BtreeGetPage(pP
2d360 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68  age->pBt, pgnoCh
2d370 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29  ild, &pChild, 0)
2d380 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2d390 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
2d3a0 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28  balance;.    if(
2d3b0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
2d3c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2d3d0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2d3e0 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
2d3f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2d400 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2d410 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
2d420 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
2d430 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
2d440 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
2d450 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
2d460 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
2d470 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
2d480 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
2d490 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
2d4a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
2d4b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2d4c0 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
2d4d0 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
2d4e0 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
2d4f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2d500 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
2d510 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2d520 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
2d530 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
2d540 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
2d550 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2d560 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
2d570 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
2d580 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
2d590 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2d5a0 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
2d5b0 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
2d5c0 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
2d5d0 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
2d5e0 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
2d5f0 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
2d600 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2d610 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2d620 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2d630 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
2d640 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2d650 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2d660 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20  rOffset+8], .   
2d670 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
2d680 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e(&pChild->aData
2d690 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73  [pChild->hdrOffs
2d6a0 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20  et+8]));.       
2d6b0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2d6c0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
2d6d0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2d6e0 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
2d6f0 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
2d700 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2d710 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2d720 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
2d730 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
2d740 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
2d750 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
2d760 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
2d770 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
2d780 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
2d790 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
2d7a0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2d7b0 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
2d7c0 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
2d7d0 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
2d7e0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
2d7f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d800 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
2d810 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
2d820 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
2d830 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
2d840 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
2d850 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  it = 0;.      rc
2d860 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2d870 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
2d880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2d890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2d8a0 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43       freePage(pC
2d8b0 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41  hild);.      TRA
2d8c0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72  CE(("BALANCE: tr
2d8d0 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64 20  ansfer child %d 
2d8e0 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c  into root %d\n",
2d8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d900 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61  Child->pgno, pPa
2d910 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
2d920 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
2d930 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
2d940 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
2d950 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2d960 55 55 4d 0a 20 20 20 20 69 66 28 20 49 53 41 55  UUM.    if( ISAU
2d970 54 4f 56 41 43 55 55 4d 20 26 26 20 72 63 3d 3d  TOVACUUM && rc==
2d980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d990 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
2d9a0 50 74 72 6d 61 70 73 28 70 50 61 67 65 29 3b 0a  Ptrmaps(pPage);.
2d9b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2d9c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
2d9d0 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68  ild);.  }.end_sh
2d9e0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20  allow_balance:. 
2d9f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70   sqlite3_free(ap
2da00 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
2da10 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
2da20 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f  e root page is o
2da30 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68  verfull.**.** Wh
2da40 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  en this happens,
2da50 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68   Create a new ch
2da60 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70  ild page and cop
2da70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  y the.** content
2da80 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e  s of the root in
2da90 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54  to the child.  T
2daa0 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f  hen make the roo
2dab0 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70  t.** page an emp
2dac0 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67  ty page with rig
2dad0 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67  htChild pointing
2dae0 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63   to the new.** c
2daf0 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c  hild.   Finally,
2db00 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e   call balance_in
2db10 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20  ternal() on the 
2db20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20  new child.** to 
2db30 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69  cause it to spli
2db40 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2db50 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
2db60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2db70 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2db80 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2db90 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
2dba0 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
2dbb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
2dbc0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2dbd0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 2a   the root page *
2dbe0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
2dbf0 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ild;    /* Point
2dc00 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
2dc10 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
2dc20 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
2dc30 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
2dc40 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  f the new child 
2dc50 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  page */.  BtShar
2dc60 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2dc70 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
2dc80 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
2dc90 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
2dca0 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61  usable size of a
2dcb0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64   page */.  u8 *d
2dcc0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
2dcd0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
2dce0 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a   parent page */.
2dcf0 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20    u8 *cdata;    
2dd00 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2dd10 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
2dd20 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ge */.  int hdr;
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2dd40 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68 65  ffset to page he
2dd50 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a  ader in parent *
2dd60 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
2dd70 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2dd80 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t to content of 
2dd90 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61  first cell in pa
2dda0 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rent */..  asser
2ddb0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  t( pCur->iPage==
2ddc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2ddd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
2dde0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a  nOverflow>0 );..
2ddf0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
2de00 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
2de10 3d 20 31 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  = 1 );.  pPage =
2de20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2de30 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
2de40 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
2de50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2de60 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2de70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2de80 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2de90 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2dea0 67 65 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c  ge) );.  rc = al
2deb0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2dec0 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70  pBt, &pChild, &p
2ded0 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d  gnoChild, pPage-
2dee0 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28  >pgno, 0);.  if(
2def0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2df00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2df10 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2df20 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
2df30 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ge) );.  usableS
2df40 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
2df50 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20  eSize;.  data = 
2df60 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2df70 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2df80 4f 66 66 73 65 74 3b 0a 20 20 63 62 72 6b 20 3d  Offset;.  cbrk =
2df90 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2dfa0 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61  hdr+5]);.  cdata
2dfb0 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61   = pChild->aData
2dfc0 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61  ;.  memcpy(cdata
2dfd0 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50  , &data[hdr], pP
2dfe0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  age->cellOffset+
2dff0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68  2*pPage->nCell-h
2e000 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63  dr);.  memcpy(&c
2e010 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74  data[cbrk], &dat
2e020 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  a[cbrk], usableS
2e030 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a 20 20 61 73  ize-cbrk);..  as
2e040 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73  sert( pChild->is
2e050 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20  Init==0 );.  rc 
2e060 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2e070 69 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  itPage(pChild);.
2e080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e090 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
2e0a0 43 6f 70 79 20 3d 20 70 50 61 67 65 2d 3e 6e 4f  Copy = pPage->nO
2e0b0 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
2e0c0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 3b  Page->aOvfl[0]);
2e0d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 68 69  .    memcpy(pChi
2e0e0 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
2e0f0 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f 70 79 29 3b  ->aOvfl, nCopy);
2e100 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  .    pChild->nOv
2e110 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e  erflow = pPage->
2e120 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
2e130 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  f( pChild->nOver
2e140 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 43  flow ){.      pC
2e150 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  hild->nFree = 0;
2e160 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2e170 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
2e180 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
2e190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
2e1a0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2e1b0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2e1c0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72  Page) );.    zer
2e1d0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
2e1e0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
2e1f0 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  ~PTF_LEAF);.    
2e200 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2e210 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2e220 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2e230 43 68 69 6c 64 29 3b 0a 20 20 20 20 54 52 41 43  Child);.    TRAC
2e240 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70  E(("BALANCE: cop
2e250 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25  y root %d into %
2e260 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
2e270 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  o, pChild->pgno)
2e280 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  );.    if( ISAUT
2e290 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2e2a0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2e2b0 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  pBt, pChild->pgn
2e2c0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
2e2d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23   pPage->pgno);.#
2e2e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e2f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2e300 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e320 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
2e330 72 6d 61 70 73 28 70 43 68 69 6c 64 29 3b 0a 20  rmaps(pChild);. 
2e340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2e350 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
2e360 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2e370 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
2e380 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
2e390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e3a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
2e3b0 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 20 20 70 43  >iPage++;.    pC
2e3c0 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 20 3d 20  ur->apPage[1] = 
2e3d0 70 43 68 69 6c 64 3b 0a 20 20 20 20 70 43 75 72  pChild;.    pCur
2e3e0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
2e3f0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2e400 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a  _nonroot(pCur);.
2e410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
2e420 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
2e430 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2e440 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
2e450 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20   page that pCur 
2e460 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
2e470 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65   to has just bee
2e480 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a  n modified in.**
2e490 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20   some way. This 
2e4a0 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73  function figures
2e4b0 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64   out if this mod
2e4c0 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20  ification means 
2e4d0 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64  the.** tree need
2e4e0 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
2e4f0 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c  , and if so call
2e500 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  s the appropriat
2e510 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20  e balancing .** 
2e520 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
2e530 50 61 72 61 6d 65 74 65 72 20 69 73 49 6e 73 65  Parameter isInse
2e540 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 20  rt is true if a 
2e550 6e 65 77 20 63 65 6c 6c 20 77 61 73 20 6a 75 73  new cell was jus
2e560 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  t inserted into 
2e570 74 68 65 0a 2a 2a 20 70 61 67 65 2c 20 6f 72 20  the.** page, or 
2e580 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2e590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2e5a0 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20  alance(BtCursor 
2e5b0 2a 70 43 75 72 2c 20 69 6e 74 20 69 73 49 6e 73  *pCur, int isIns
2e5c0 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ert){.  int rc =
2e5d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
2e5e0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2e5f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e600 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20 20 61 73 73  ->iPage];..  ass
2e610 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2e620 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2e630 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2e640 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2e650 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
2e660 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e670 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e680 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2e690 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
2e6a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
2e6b0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2e6c0 6e 63 65 5f 64 65 65 70 65 72 28 70 43 75 72 29  nce_deeper(pCur)
2e6d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e6e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d  pCur->apPage[0]=
2e6f0 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =pPage );.      
2e700 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2e710 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72  Overflow==0 || r
2e720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2e730 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2e740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2e750 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2e760 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2e770 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70  ance_shallower(p
2e780 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Cur);.      asse
2e790 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2e7a0 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20  [0]==pPage );.  
2e7b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e7c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2e7d0 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
2e7e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
2e7f0 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
2e800 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
2e810 20 0a 20 20 20 20 20 20 20 20 28 21 69 73 49 6e   .        (!isIn
2e820 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e  sert && pPage->n
2e830 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d  Free>pPage->pBt-
2e840 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
2e850 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2e860 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2e870 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
2e880 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e890 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e8a0 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
2e8b0 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
2e8c0 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
2e8d0 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
2e8e0 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
2e8f0 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
2e900 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
2e910 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
2e920 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2e930 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
2e940 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
2e950 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
2e960 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
2e970 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
2e980 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
2e990 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
2e9a0 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
2e9b0 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
2e9c0 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
2e9d0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2e9e0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
2e9f0 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c  ED..**.** As wel
2ea00 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69 74  l as cursors wit
2ea10 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72  h wrFlag==0, cur
2ea20 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61 67  sors with wrFlag
2ea30 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69 73 49 6e  ==1 and .** isIn
2ea40 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20  crblobHandle==1 
2ea50 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65  are also conside
2ea60 72 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f  red 'read' curso
2ea70 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20  rs. Incremental 
2ea80 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  .** blob cursors
2ea90 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f   are used for bo
2eaa0 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  th reading and w
2eab0 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68  riting..**.** Wh
2eac0 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  en pgnoRoot is t
2ead0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2eae0 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  an intkey table,
2eaf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2eb00 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e  s also.** respon
2eb10 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69  sible for invali
2eb20 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74  dating increment
2eb30 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  al blob cursors 
2eb40 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72  when the table r
2eb50 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74  ow.** on which t
2eb60 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69  hey are opened i
2eb70 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64  s deleted or mod
2eb80 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61  ified. Cursors a
2eb90 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
2eba0 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  * according to t
2ebb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c  he following rul
2ebc0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2ebd0 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61  hen BtreeClearTa
2ebe0 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ble() is called 
2ebf0 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65  to completely de
2ec00 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lete the content
2ec10 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42  s.**      of a B
2ec20 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78  -Tree table, pEx
2ec30 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20  clude is set to 
2ec40 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74  zero and paramet
2ec50 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20  er iRow is .**  
2ec60 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a      set to non-z
2ec70 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
2ec80 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61  e all incrementa
2ec90 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  l blob cursors o
2eca0 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  pen.**      on t
2ecb0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2ecc0 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20  at pgnoRoot are 
2ecd0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
2ece0 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42 74 72  **   2) When Btr
2ecf0 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65  eeInsert(), Btre
2ed00 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
2ed10 65 65 50 75 74 44 61 74 61 28 29 20 69 73 20 63  eePutData() is c
2ed20 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20  alled to .**    
2ed30 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65    modify a table
2ed40 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20   row via an SQL 
2ed50 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c  statement, pExcl
2ed60 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ude is set to th
2ed70 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65  e .**      write
2ed80 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
2ed90 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74  do the modificat
2eda0 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65  ion and paramete
2edb0 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a  r iRow is set.**
2edc0 20 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74        to the int
2edd0 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74  eger row id of t
2ede0 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20  he B-Tree entry 
2edf0 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20  being modified. 
2ee00 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70  Unless.**      p
2ee10 45 78 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c  Exclude is itsel
2ee20 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
2ee30 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68   blob cursor, th
2ee40 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  en all increment
2ee50 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20  al.**      blob 
2ee60 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
2ee70 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20  row iRow of the 
2ee80 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c  B-Tree are inval
2ee90 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
2eea0 33 29 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c  3) If both pExcl
2eeb0 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65  ude and iRow are
2eec0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f   set to zero, no
2eed0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2eee0 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f  b .**      curso
2eef0 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
2ef00 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2ef10 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
2ef20 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
2ef30 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  e, .  Pgno pgnoR
2ef40 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72 73 6f 72  oot, .  BtCursor
2ef50 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20 20 69 36   *pExclude,.  i6
2ef60 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42 74 43 75  4 iRow.){.  BtCu
2ef70 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
2ef80 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
2ef90 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  e->pBt;.  sqlite
2efa0 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  3 *db = pBtree->
2efb0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
2efc0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2efd0 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
2efe0 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
2eff0 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
2f000 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d  ext){.    if( p=
2f010 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74  =pExclude ) cont
2f020 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
2f030 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52  >pgnoRoot!=pgnoR
2f040 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oot ) continue;.
2f050 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f060 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
2f070 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c   if( p->isIncrbl
2f080 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20  obHandle && ( . 
2f090 20 20 20 20 20 20 20 20 28 21 70 45 78 63 6c 75          (!pExclu
2f0a0 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20  de && iRow).    
2f0b0 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26    || (pExclude &
2f0c0 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49  & !pExclude->isI
2f0d0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
2f0e0 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
2f0f0 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  Row).    )){.   
2f100 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
2f110 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2f120 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2f130 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
2f140 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
2f150 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2f160 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69  p->wrFlag==0 .#i
2f170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f180 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
2f190 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  || p->isIncrblob
2f1a0 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20  Handle.#endif.  
2f1b0 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
2f1c0 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d  e3 *dbOther = p-
2f1d0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
2f1e0 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d     if( dbOther==
2f1f0 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64  0 ||.         (d
2f200 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64  bOther!=db && (d
2f210 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20  bOther->flags & 
2f220 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2f230 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20  mitted)==0) ){. 
2f240 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2f250 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
2f260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2f270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f280 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
2f290 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
2f2a0 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
2f2b0 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
2f2c0 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
2f2d0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
2f2e0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
2f2f0 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
2f300 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
2f310 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
2f320 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
2f330 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
2f340 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
2f350 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2f360 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2f370 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
2f380 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
2f390 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
2f3a0 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
2f3b0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
2f3c0 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
2f3d0 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
2f3e0 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
2f3f0 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
2f400 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
2f410 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  th ignored..*/.i
2f420 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
2f430 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
2f440 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2f450 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
2f460 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
2f470 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
2f480 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
2f490 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
2f4a0 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
2f4b0 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
2f4c0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
2f4d0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
2f4e0 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65  t nData,  /* The
2f4f0 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
2f500 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
2f510 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
2f520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2f530 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30  umber of extra 0
2f540 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2f550 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   to data */.  in
2f560 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20 20  t appendBias    
2f570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f580 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2f590 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64  likely an append
2f5a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2f5b0 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e  .  int loc;.  in
2f5c0 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t szNew;.  int i
2f5d0 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2f5e0 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
2f5f0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
2f600 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2f610 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
2f620 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
2f630 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
2f640 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
2f650 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
2f660 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2f670 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2f680 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2f690 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2f6a0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  E );.  assert( !
2f6b0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2f6c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2f6d0 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 69 66 28  >wrFlag );.  if(
2f6e0 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2f6f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCur->pBtree, pC
2f700 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2f710 75 72 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20  ur, nKey) ){.   
2f720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2f730 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
2f740 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
2f750 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
2f760 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ck */.  }.  if( 
2f770 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2f780 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2f790 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2f7a0 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  kip;.  }..  /* S
2f7b0 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
2f7c0 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
2f7d0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
2f7e0 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  his table */.  s
2f7f0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2f800 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
2f810 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f  if( .    SQLITE_
2f820 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
2f830 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2f840 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2f850 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49  ur)) ||.    SQLI
2f860 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
2f870 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
2f880 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  pCur, pKey, nKey
2f890 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c  , appendBias, &l
2f8a0 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  oc)).  ){.    re
2f8b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2f8c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2f8d0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2f8e0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
2f8f0 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b  ge->intKey || nK
2f900 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
2f910 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c  t( pPage->leaf |
2f920 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | !pPage->intKey
2f930 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e   );.  TRACE(("IN
2f940 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e  SERT: table=%d n
2f950 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25  key=%lld ndata=%
2f960 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c  d page=%d %s\n",
2f970 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2f980 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c  >pgnoRoot, nKey,
2f990 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70   nData, pPage->p
2f9a0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  gno,.          l
2f9b0 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69  oc==0 ? "overwri
2f9c0 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79  te" : "new entry
2f9d0 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  "));.  assert( p
2f9e0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2f9f0 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
2fa00 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43  ace(pBt);.  newC
2fa10 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
2fa20 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43  pace;.  if( newC
2fa30 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
2fa40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2fa50 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
2fa60 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20  pPage, newCell, 
2fa70 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74  pKey, nKey, pDat
2fa80 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c  a, nData, nZero,
2fa90 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20   &szNew);.  if( 
2faa0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
2fab0 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  sert;.  assert( 
2fac0 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50  szNew==cellSizeP
2fad0 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  tr(pPage, newCel
2fae0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
2faf0 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53  szNew<=MX_CELL_S
2fb00 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64  IZE(pBt) );.  id
2fb10 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2fb20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2fb30 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55  if( loc==0 && CU
2fb40 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2fb50 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2fb60 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61  u16 szOld;.    a
2fb70 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 67 65  ssert( idx<pPage
2fb80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
2fb90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fba0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2fbb0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2fbc0 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
2fbd0 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
2fbe0 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20  }.    oldCell = 
2fbf0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2fc00 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70  idx);.    if( !p
2fc10 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2fc20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65      memcpy(newCe
2fc30 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b  ll, oldCell, 4);
2fc40 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64  .    }.    szOld
2fc50 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2fc60 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
2fc70 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
2fc80 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  ll(pPage, oldCel
2fc90 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2fca0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2fcb0 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43  ;.    rc = dropC
2fcc0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
2fcd0 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20  szOld);.    if( 
2fce0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2fcf0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
2fd00 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
2fd10 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30   }else if( loc<0
2fd20 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
2fd30 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
2fd40 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
2fd50 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  .    idx = ++pCu
2fd60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2fd70 50 61 67 65 5d 3b 0a 20 20 20 20 70 43 75 72 2d  Page];.    pCur-
2fd80 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2fd90 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
2fda0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  NKey = 0;.  }els
2fdb0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2fdc0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
2fdd0 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43  }.  rc = insertC
2fde0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
2fdf0 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
2fe00 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
2fe10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fe20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2fe30 43 75 72 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  Cur, 1);.  }..  
2fe40 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75 72  /* Must make sur
2fe50 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 72  e nOverflow is r
2fe60 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76 65  eset to zero eve
2fe70 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63 65  n if the balance
2fe80 28 29 0a 20 20 2a 2a 20 66 61 69 6c 73 2e 20 20  ().  ** fails.  
2fe90 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  Internal data st
2fea0 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69  ructure corrupti
2feb0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f  on will result o
2fec0 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 70  therwise. */.  p
2fed0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2fee0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66  ->iPage]->nOverf
2fef0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  low = 0;..  if( 
2ff00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ff10 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
2ff20 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69  pCur);.  }.end_i
2ff30 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20  nsert:.  return 
2ff40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
2ff50 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68  ete the entry th
2ff60 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
2ff70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
2ff80 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
2ff90 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2ffa0 20 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63   a arbitrary loc
2ffb0 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
2ffc0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2ffd0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ffe0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2fff0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
30000 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
30010 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 75 6e 73    int idx;.  uns
30020 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
30030 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  l;.  int rc;.  P
30040 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
30050 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  0;.  Btree *p = 
30060 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
30070 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
30080 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
30090 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
300a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
300b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
300c0 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
300d0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
300e0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
300f0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  E );.  assert( !
30100 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
30110 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
30120 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
30130 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
30140 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
30150 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
30160 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
30170 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  age]>=pPage->nCe
30180 6c 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ll) ){.    retur
30190 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  n SQLITE_ERROR; 
301a0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69   /* The cursor i
301b0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
301c0 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  o anything */.  
301d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
301e0 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 69 66  ->wrFlag );.  if
301f0 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
30200 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
30210 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
30220 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  Cur, pCur->info.
30230 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74  nKey) ){.    ret
30240 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
30250 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
30260 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
30270 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
30280 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  /.  }..  /* Rest
30290 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
302a0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
302b0 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20  (a no-op if the 
302c0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  cursor is not in
302d0 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45   .  ** CURSOR_RE
302e0 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29  QUIRESEEK state)
302f0 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f   and save the po
30300 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
30310 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20  ther cursors .  
30320 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  ** open on the s
30330 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20  ame table. Then 
30340 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
30350 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20  rWrite() on the 
30360 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  page.  ** that t
30370 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  he entry will be
30380 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20   deleted from.. 
30390 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
303a0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
303b0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
303c0 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
303d0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
303e0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
303f0 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20  Root, pCur))!=0 
30400 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c  ||.    (rc = sql
30410 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30420 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
30430 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
30440 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
30450 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   Locate the cell
30460 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65   within its page
30470 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c   and leave pCell
30480 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
30490 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20  .  ** data. The 
304a0 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c  clearCell() call
304b0 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66   frees any overf
304c0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
304d0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
304e0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c  ** cell. The cel
304f0 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c  l itself is stil
30500 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20  l intact..  */. 
30510 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
30520 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
30530 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
30540 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
30550 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
30560 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43  eaf ){.    pgnoC
30570 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
30580 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63  pCell);.  }.  rc
30590 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
305a0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66  ge, pCell);.  if
305b0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
305c0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
305d0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
305e0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
305f0 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72 65  The entry we are
30600 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65   about to delete
30610 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73   is not a leaf s
30620 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20  o if we do not. 
30630 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69     ** do somethi
30640 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ng we will leave
30650 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e   a hole on an in
30660 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20  ternal page..   
30670 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66   ** We have to f
30680 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20  ill the hole by 
30690 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c  moving in a cell
306a0 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54   from a leaf.  T
306b0 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43  he.    ** next C
306c0 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e  ell after the on
306d0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
306e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
306f0 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a   exist and.    *
30700 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73  * to be a leaf s
30710 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e  o we can use it.
30720 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75  .    */.    BtCu
30730 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20  rsor leafCur;.  
30740 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66    MemPage *pLeaf
30750 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 75  Page = 0;..    u
30760 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
30770 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74  ext;.    int not
30780 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Used;.    unsign
30790 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c  ed char *tempCel
307a0 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
307b0 74 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  t( !pPage->intKe
307c0 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
307d0 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
307e0 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
307f0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
30800 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
30810 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
30820 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
30830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30840 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75    assert( leafCu
30850 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e  r.aiIdx[leafCur.
30860 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20  iPage]==0 );.   
30870 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c     pLeafPage = l
30880 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65  eafCur.apPage[le
30890 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20  afCur.iPage];.  
308a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
308b0 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66  PagerWrite(pLeaf
308c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
308d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
308e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
308f0 20 20 20 20 20 69 6e 74 20 6c 65 61 66 43 75 72       int leafCur
30900 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 30 3b 0a  sorInvalid = 0;.
30910 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74        u16 szNext
30920 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
30930 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
30940 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c   delete internal
30950 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65   from %d replace
30960 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
30970 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  ,.         pCur-
30980 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
30990 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66 50 61 67  ->pgno, pLeafPag
309a0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  e->pgno));.     
309b0 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
309c0 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74   idx, cellSizePt
309d0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
309e0 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
309f0 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 50 61  findCell(pLeafPa
30a00 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 7a  ge, 0);.      sz
30a10 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Next = cellSizeP
30a20 74 72 28 70 4c 65 61 66 50 61 67 65 2c 20 70 4e  tr(pLeafPage, pN
30a30 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ext);.      asse
30a40 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  rt( MX_CELL_SIZE
30a50 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20  (pBt)>=szNext+4 
30a60 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74  );.      allocat
30a70 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
30a80 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20  .      tempCell 
30a90 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
30aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70  ;.      if( temp
30ab0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
30ac0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
30ad0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
30ae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30af0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30b00 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
30b10 28 70 50 61 67 65 2c 20 69 64 78 2c 20 70 4e 65  (pPage, idx, pNe
30b20 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20  xt-4, szNext+4, 
30b30 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20  tempCell, 0);.  
30b40 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a      }...      /*
30b50 20 54 68 65 20 22 69 66 22 20 73 74 61 74 65 6d   The "if" statem
30b60 65 6e 74 20 69 6e 20 74 68 65 20 6e 65 78 74 20  ent in the next 
30b70 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73 20 63 72  code block is cr
30b80 69 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  itical.  The.   
30b90 20 20 20 2a 2a 20 73 6c 69 67 68 74 65 73 74 20     ** slightest 
30ba0 65 72 72 6f 72 20 69 6e 20 74 68 61 74 20 73 74  error in that st
30bb0 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 61 6c  atement would al
30bc0 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f 20 6f 70  low SQLite to op
30bd0 65 72 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 63  erate.      ** c
30be0 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74 20 6f 66  orrectly most of
30bf0 20 74 68 65 20 74 69 6d 65 20 62 75 74 20 70 72   the time but pr
30c00 6f 64 75 63 65 20 76 65 72 79 20 72 61 72 65 20  oduce very rare 
30c10 66 61 69 6c 75 72 65 73 2e 20 20 54 6f 0a 20 20  failures.  To.  
30c20 20 20 20 20 2a 2a 20 67 75 61 72 64 20 61 67 61      ** guard aga
30c30 69 6e 73 74 20 74 68 69 73 2c 20 74 68 65 20 66  inst this, the f
30c40 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20  ollowing macros 
30c50 68 65 6c 70 20 74 6f 20 76 65 72 69 66 79 20 74  help to verify t
30c60 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hat.      ** the
30c70 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20   "if" statement 
30c80 69 73 20 77 65 6c 6c 20 74 65 73 74 65 64 2e 0a  is well tested..
30c90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
30ca0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
30cb0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
30cc0 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 70 42 74  pPage->nFree<pBt
30cd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
30ce0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
30cf0 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d     && pLeafPage-
30d00 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20  >nFree+2+szNext 
30d10 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
30d20 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74  e*2/3 );.      t
30d30 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
30d40 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
30d50 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42  pPage->nFree==pB
30d60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
30d70 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3 .             
30d80 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
30d90 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
30da0 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
30db0 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20  ze*2/3 );.      
30dc0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
30dd0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
30de0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70   pPage->nFree==p
30df0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
30e00 2f 33 2b 31 20 0a 20 20 20 20 20 20 20 20 20 20  /3+1 .          
30e10 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
30e20 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
30e30 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
30e40 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
30e50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
30e60 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
30e70 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
30e80 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
30e90 2a 32 2f 33 0a 20 20 20 20 20 20 20 20 20 20 20  *2/3.           
30ea0 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
30eb0 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
30ec0 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
30ed0 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
30ee0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 50 61    testcase( (pPa
30ef0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
30f00 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65  || (pPage->nFree
30f10 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
30f20 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20 20 20 20  ze*2/3)).       
30f30 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
30f40 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
30f50 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74 2d 3e 75  szNext == pBt->u
30f60 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
30f70 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70 50  ...      if( (pP
30f80 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
30f90 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65   || (pPage->nFre
30fa0 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e > pBt->usableS
30fb0 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a 20 20 20  ize*2/3)) &&.   
30fc0 20 20 20 20 20 20 20 28 70 4c 65 61 66 50 61 67         (pLeafPag
30fd0 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
30fe0 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
30ff0 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20 20 20 29  ize*2/3).      )
31000 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
31010 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
31020 6e 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  n if the interna
31030 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20 65 69  l node is now ei
31040 74 68 65 72 20 6f 76 65 72 66 6c 6f 77 69 6e 67  ther overflowing
31050 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 75  .        ** or u
31060 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 74 68 65  nderfull and the
31070 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 6c 6c 20   leaf node will 
31080 62 65 20 75 6e 64 65 72 66 75 6c 6c 20 61 66 74  be underfull aft
31090 65 72 20 74 68 65 20 6a 75 73 74 20 63 65 6c 6c  er the just cell
310a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70   .        ** cop
310b0 69 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ied to the inter
310c0 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64 65 6c 65  nal node is dele
310d0 74 65 64 20 66 72 6f 6d 20 69 74 2e 20 54 68 69  ted from it. Thi
310e0 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 0a 20  s is a special. 
310f0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 62         ** case b
31100 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
31110 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 74 6f 20  to balance() to 
31120 63 6f 72 72 65 63 74 20 74 68 65 20 69 6e 74 65  correct the inte
31130 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20 20 20 20  rnal node.      
31140 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e 67 65 20    ** may change 
31150 74 68 65 20 74 72 65 65 20 73 74 72 75 63 74 75  the tree structu
31160 72 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  re and invalidat
31170 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
31180 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
31190 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b   leafCur.apPage[
311a0 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69  ] and leafCur.ai
311b0 49 64 78 5b 5d 20 61 72 72 61 79 73 2c 20 77 68  Idx[] arrays, wh
311c0 69 63 68 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ich will be.    
311d0 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
311e0 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 65 71  he balance() req
311f0 75 69 72 65 64 20 74 6f 20 63 6f 72 72 65 63 74  uired to correct
31200 20 74 68 65 20 75 6e 64 65 72 66 75 6c 6c 20 6c   the underfull l
31210 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  eaf.        ** n
31220 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ode..        **.
31230 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66          ** The f
31240 6f 72 6d 75 6c 61 20 75 73 65 64 20 69 6e 20 74  ormula used in t
31250 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 62  he expression ab
31260 6f 76 65 20 61 72 65 20 62 61 73 65 64 20 6f 6e  ove are based on
31270 20 66 61 63 65 74 73 20 6f 66 0a 20 20 20 20 20   facets of.     
31280 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65     ** the SQLite
31290 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 74 68 61   file-format tha
312a0 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  t do not change 
312b0 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20 20 20 20  over time..     
312c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65     */.        te
312d0 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
312e0 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c  Free==pBt->usabl
312f0 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20  eSize*2/3+1 );. 
31300 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31310 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
31320 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70 42 74 2d  e+2+szNext==pBt-
31330 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b  >usableSize*2/3+
31340 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 61  1 );.        lea
31350 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d  fCursorInvalid =
31360 20 31 3b 0a 20 20 20 20 20 20 7d 20 20 20 20 20   1;.      }     
31370 20 20 20 0a 0a 20 20 20 20 20 20 69 66 28 20 72     ..      if( r
31380 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31390 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
313a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
313b0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
313c0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
313d0 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
313e0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
313f0 67 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43 68  ge, idx), pgnoCh
31400 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 56 56  ild);.        VV
31410 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61  A_ONLY( pCur->pa
31420 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 30 20  gesShuffled = 0 
31430 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31440 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
31450 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31460 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31470 4f 4b 20 26 26 20 6c 65 61 66 43 75 72 73 6f 72  OK && leafCursor
31480 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  Invalid ){.     
31490 20 20 20 2f 2a 20 54 68 65 20 6c 65 61 66 2d 6e     /* The leaf-n
314a0 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e 64 65 72  ode is now under
314b0 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74 68 65 20  full and so the 
314c0 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65  tree needs to be
314d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 62   .        ** reb
314e0 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65 76 65 72  alanced. However
314f0 2c 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  , the balance() 
31500 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
31510 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
31520 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f 76 65 20    ** node above 
31530 6d 61 79 20 68 61 76 65 20 6d 6f 64 69 66 69 65  may have modifie
31540 64 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  d the structure 
31550 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 6e  of the B-Tree an
31560 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20  d.        ** so 
31570 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
31580 65 6e 74 73 20 6f 66 20 6c 65 61 66 43 75 72 2e  ents of leafCur.
31590 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61  apPage[] and lea
315a0 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a 20 20 20  fCur.aiIdx[].   
315b0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20       ** may not 
315c0 62 65 20 74 72 75 73 74 65 64 2e 0a 20 20 20 20  be trusted..    
315d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
315e0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
315f0 69 62 6c 65 20 74 6f 20 63 6f 70 79 20 74 68 65  ible to copy the
31600 20 61 6e 63 65 73 74 72 79 20 66 72 6f 6d 20 70   ancestry from p
31610 43 75 72 2c 20 61 73 20 74 68 65 20 73 61 6d 65  Cur, as the same
31620 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
31630 6e 63 65 28 29 20 63 61 6c 6c 20 68 61 73 20 69  nce() call has i
31640 6e 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 70  nvalidated the p
31650 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d 20 61 6e  Cur->apPage[] an
31660 64 20 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20  d aiIdx[].      
31670 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 0a 20 20    ** arrays. .  
31680 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31690 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
316a0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
316b0 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e 74 65 72  on() below inter
316c0 6e 61 6c 6c 79 20 73 61 76 65 73 20 74 68 65 20  nally saves the 
316d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  .        ** key 
316e0 74 68 61 74 20 6c 65 61 66 43 75 72 20 69 73 20  that leafCur is 
316f0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
31700 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e 74 6c 79  ng to. Currently
31710 2c 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  , there.        
31720 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f 70 69 65  ** are two copie
31730 73 20 6f 66 20 74 68 61 74 20 6b 65 79 20 69 6e  s of that key in
31740 20 74 68 65 20 74 72 65 65 20 2d 20 6f 6e 65 20   the tree - one 
31750 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 65 61 66  here on the leaf
31760 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
31770 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d 65   and one on some
31780 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69   internal node i
31790 6e 20 74 68 65 20 74 72 65 65 2e 20 54 68 65 20  n the tree. The 
317a0 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20 20 20 20  copy on.        
317b0 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  ** the leaf node
317c0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e   is always the n
317d0 65 78 74 20 6b 65 79 20 69 6e 20 74 72 65 65 2d  ext key in tree-
317e0 6f 72 64 65 72 20 61 66 74 65 72 20 74 68 65 20  order after the 
317f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
31800 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   on the internal
31810 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68 65 20 63   node. So, the c
31820 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
31830 72 65 65 4e 65 78 74 28 29 0a 20 20 20 20 20 20  reeNext().      
31840 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65 73 74 6f    ** calls resto
31850 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
31860 28 29 20 74 6f 20 70 6f 69 6e 74 20 74 68 65 20  () to point the 
31870 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 63 6f  cursor to the co
31880 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  py.        ** st
31890 6f 72 65 64 20 6f 6e 20 74 68 65 20 69 6e 74 65  ored on the inte
318a0 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65 6e 20  rnal node, then 
318b0 61 64 76 61 6e 63 65 73 20 74 6f 20 74 68 65 20  advances to the 
318c0 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20 20 20 20  next entry,.    
318d0 20 20 20 20 2a 2a 20 77 68 69 63 68 20 68 61 70      ** which hap
318e0 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 63  pens to be the c
318f0 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  opy of the key o
31900 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
31910 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ode..        ** 
31920 4e 65 74 20 65 66 66 65 63 74 3a 20 6c 65 61 66  Net effect: leaf
31930 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
31940 62 61 63 6b 20 74 6f 20 74 68 65 20 64 75 70 6c  back to the dupl
31950 69 63 61 74 65 20 63 65 6c 6c 0a 20 20 20 20 20  icate cell.     
31960 20 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 73     ** that needs
31970 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2c 20   to be removed, 
31980 61 6e 64 20 74 68 65 20 6c 65 61 66 43 75 72 2e  and the leafCur.
31990 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a 20 20 20  apPage[] and.   
319a0 20 20 20 20 20 2a 2a 20 6c 65 61 66 43 75 72 2e       ** leafCur.
319b0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 20 61  aiIdx[] arrays a
319c0 72 65 20 63 6f 72 72 65 63 74 2e 0a 20 20 20 20  re correct..    
319d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56      */.        V
319e0 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c 65  VA_ONLY( Pgno le
319f0 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61 66 50 61  afPgno = pLeafPa
31a00 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 20 20  ge->pgno );.    
31a10 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72      rc = saveCur
31a20 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26 6c 65 61  sorPosition(&lea
31a30 66 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 69  fCur);.        i
31a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31a60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
31a70 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e  ext(&leafCur, &n
31a80 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 20 20 20  otUsed);.       
31a90 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66   }.        pLeaf
31aa0 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61  Page = leafCur.a
31ab0 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50  pPage[leafCur.iP
31ac0 61 67 65 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  age];.        as
31ad0 73 65 72 74 28 20 70 4c 65 61 66 50 61 67 65 2d  sert( pLeafPage-
31ae0 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20  >pgno==leafPgno 
31af0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31b00 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  t( leafCur.aiIdx
31b10 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d  [leafCur.iPage]=
31b20 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
31b30 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
31b40 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20 20 26 26  OK==rc.       &&
31b50 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
31b60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31b70 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70  ite(pLeafPage->p
31b80 44 62 50 61 67 65 29 29 20 0a 20 20 20 20 20 20  DbPage)) .      
31b90 29 7b 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  ){.        dropC
31ba0 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30  ell(pLeafPage, 0
31bb0 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20  , szNext);.     
31bc0 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6c 65 61     VVA_ONLY( lea
31bd0 66 43 75 72 2e 70 61 67 65 73 53 68 75 66 66 6c  fCur.pagesShuffl
31be0 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20  ed = 0 );.      
31bf0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 26    rc = balance(&
31c00 6c 65 61 66 43 75 72 2c 20 30 29 3b 0a 20 20 20  leafCur, 0);.   
31c10 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
31c20 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 7c  fCursorInvalid |
31c30 7c 20 21 6c 65 61 66 43 75 72 2e 70 61 67 65 73  | !leafCur.pages
31c40 53 68 75 66 66 6c 65 64 0a 20 20 20 20 20 20 20  Shuffled.       
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c60 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21              || !
31c70 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
31c80 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
31c90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
31ca0 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70  BtreeReleaseTemp
31cb0 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29  Cursor(&leafCur)
31cc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
31cd0 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
31ce0 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66  able=%d delete f
31cf0 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
31d00 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
31d10 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67  oRoot, pPage->pg
31d20 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  no));.    rc = d
31d30 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
31d40 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
31d50 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
31d60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
31d80 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
31d90 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
31da0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31db0 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
31dc0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
31dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31de0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
31df0 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
31e00 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
31e10 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
31e20 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
31e30 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
31e40 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
31e50 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
31e60 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
31e70 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
31e80 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
31e90 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
31ea0 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
31eb0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
31ec0 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
31ed0 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
31ee0 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
31ef0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
31f00 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
31f10 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
31f20 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
31f30 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
31f40 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
31f50 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
31f60 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
31f70 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
31f80 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
31f90 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
31fa0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
31fb0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
31fc0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
31fd0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
31fe0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
31ff0 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
32000 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
32010 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
32020 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
32030 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
32040 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
32050 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
32060 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
32070 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nly );..#ifdef S
32080 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32090 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c  ACUUM.  rc = all
320a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
320b0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
320c0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
320d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
320e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
320f0 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  se.  if( pBt->au
32100 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
32110 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20  Pgno pgnoMove;  
32120 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61      /* Move a pa
32130 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20  ge here to make 
32140 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f  room for the roo
32150 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65  t-page */.    Me
32160 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65  mPage *pPageMove
32170 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f  ; /* The page to
32180 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20   move to. */..  
32190 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20    /* Creating a 
321a0 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72  new table may pr
321b0 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d  obably require m
321c0 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  oving an existin
321d0 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  g database.    *
321e0 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  * to make room f
321f0 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
32200 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20  s root page. In 
32210 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74  case this page t
32220 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20  urns.    ** out 
32230 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  to be an overflo
32240 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61  w page, delete a
32250 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ll overflow page
32260 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20  -map caches.    
32270 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20  ** held by open 
32280 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a  cursors..    */.
32290 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
322a0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
322b0 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Bt);..    /* Rea
322c0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
322d0 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
322e0 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
322f0 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
32300 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
32310 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
32320 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
32330 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
32340 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
32350 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
32360 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
32370 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
32380 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
32390 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
323a0 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
323b0 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a   4, &pgnoRoot);.
323c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
323d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
323e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
323f0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
32400 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
32410 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f  root-page may no
32420 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t be allocated o
32430 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  n a pointer-map 
32440 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20  page, or the.   
32450 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
32460 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
32470 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f    while( pgnoRoo
32480 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  t==PTRMAP_PAGENO
32490 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20  (pBt, pgnoRoot) 
324a0 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52  ||.        pgnoR
324b0 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  oot==PENDING_BYT
324c0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
324d0 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b       pgnoRoot++;
324e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
324f0 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29  t( pgnoRoot>=3 )
32500 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
32510 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70  te a page. The p
32520 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  age that current
32530 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67  ly resides at pg
32540 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20  noRoot will.    
32550 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  ** be moved to t
32560 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
32570 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c  e (unless the al
32580 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70  located page hap
32590 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72  pens.    ** to r
325a0 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f  eside at pgnoRoo
325b0 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  t)..    */.    r
325c0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
325d0 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67  ePage(pBt, &pPag
325e0 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65  eMove, &pgnoMove
325f0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a  , pgnoRoot, 1);.
32600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
32620 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
32630 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76  .    if( pgnoMov
32640 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  e!=pgnoRoot ){. 
32650 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74       /* pgnoRoot
32660 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
32670 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
32680 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
32690 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
326a0 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75   new table (assu
326b0 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69  ming an error di
326c0 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75  d not occur). Bu
326d0 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20  t we were.      
326e0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e  ** allocated pgn
326f0 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72  oMove. If requir
32700 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77  ed (i.e. if it w
32710 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  as not allocated
32720 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74  .      ** by ext
32730 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29  ending the file)
32740 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  , the current pa
32750 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70  ge at position p
32760 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a  gnoMove.      **
32770 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72   is already jour
32780 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  naled..      */.
32790 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
327a0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50        Pgno iPtrP
327b0 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65  age;..      rele
327c0 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76  asePage(pPageMov
327d0 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f  e);..      /* Mo
327e0 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72  ve the page curr
327f0 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f  ently at pgnoRoo
32800 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a  t to pgnoMove. *
32810 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
32820 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
32830 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
32840 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
32850 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32860 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
32870 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32880 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
32890 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
328a0 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
328b0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
328c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
328d0 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  K || eType==PTRM
328e0 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65  AP_ROOTPAGE || e
328f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
32900 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
32910 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
32920 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
32930 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
32940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
32950 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
32960 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
32970 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
32980 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
32990 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
329a0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f  atePage(pBt, pRo
329b0 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ot, eType, iPtrP
329c0 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30  age, pgnoMove, 0
329d0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
329e0 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20  Page(pRoot);..  
329f0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68      /* Obtain th
32a00 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f  e page at pgnoRo
32a10 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
32a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32a30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
32a40 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
32a50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
32a60 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
32a70 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
32a80 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
32a90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32aa0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
32ab0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
32ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32ad0 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
32ae0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
32af0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32b00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
32b10 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
32b20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
32b30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
32b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
32b50 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
32b60 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
32b70 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
32b80 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
32b90 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
32ba0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
32bb0 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
32bc0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
32bd0 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
32be0 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
32bf0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32c00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
32c10 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
32c20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
32c30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
32c40 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
32c50 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
32c60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32c70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
32c80 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
32c90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
32ca0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
32cb0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
32cc0 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
32cd0 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
32ce0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
32cf0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
32d00 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
32d10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
32d20 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
32d30 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61  age) );.  zeroPa
32d40 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20  ge(pRoot, flags 
32d50 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73  | PTF_LEAF);.  s
32d60 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
32d70 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
32d80 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
32d90 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
32da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32db0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
32dc0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
32dd0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
32de0 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
32df0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
32e00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
32e10 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
32e20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
32e30 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
32e40 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
32e50 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
32e60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
32e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32e80 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
32e90 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
32ea0 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
32eb0 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
32ec0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
32ed0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
32ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
32ef0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
32f00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
32f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
32f20 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
32f30 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
32f40 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
32f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
32f60 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
32f70 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65  ar */.  int free
32f80 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a  PageFlag,     /*
32f90 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65   Deallocate page
32fa0 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
32fb0 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20  t *pnChange.){. 
32fc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
32fd0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
32fe0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
32ff0 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pCell;.  int i;.
33000 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
33010 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
33020 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
33030 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67  f( pgno>pagerPag
33040 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
33050 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33060 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33070 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   }..  rc = getAn
33080 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
33090 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
330a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
330b0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
330c0 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
330d0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
330e0 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
330f0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
33100 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
33110 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
33120 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
33130 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
33140 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
33150 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
33160 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
33170 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
33180 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
33190 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
331a0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
331b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
331c0 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
331d0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
331e0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
331f0 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  f ){.    rc = cl
33200 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
33210 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
33220 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c  Page->aData[8]),
33230 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
33240 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
33250 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
33260 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  ge_out;.  }else 
33270 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a  if( pnChange ){.
33280 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33290 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  e->intKey );.   
332a0 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50   *pnChange += pP
332b0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  age->nCell;.  }.
332c0 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c    if( freePageFl
332d0 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ag ){.    rc = f
332e0 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
332f0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
33300 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33310 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
33320 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ge))==0 ){.    z
33330 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
33340 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c  Page->aData[0] |
33350 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a   PTF_LEAF);.  }.
33360 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61  .cleardatabasepa
33370 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  ge_out:.  releas
33380 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
33390 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
333a0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  .** Delete all i
333b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
333c0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
333d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
333e0 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68   iTable is.** th
333f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
33400 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
33410 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74   table.  After t
33420 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
33430 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74  rns,.** the root
33440 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20   page is empty, 
33450 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73  but still exists
33460 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
33470 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
33480 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
33490 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
334a0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20  ny open.** read 
334b0 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
334c0 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74  able.  Open writ
334d0 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f  e cursors are mo
334e0 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f  ved to the.** ro
334f0 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
33500 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e  .**.** If pnChan
33510 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
33520 74 68 65 6e 20 74 61 62 6c 65 20 69 54 61 62 6c  then table iTabl
33530 65 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74  e must be an int
33540 6b 65 79 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a  key table. The.*
33550 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * integer value 
33560 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 6e  pointed to by pn
33570 43 68 61 6e 67 65 20 69 73 20 69 6e 63 72 65 6d  Change is increm
33580 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
33590 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65  ber of.** entrie
335a0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
335b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
335c0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
335d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
335e0 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67  le, int *pnChang
335f0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
33600 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
33610 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
33620 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
33630 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
33640 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
33650 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
33660 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 28 72  RITE );.  if( (r
33670 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  c = checkReadLoc
33680 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c  ks(p, iTable, 0,
33690 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   1))!=SQLITE_OK 
336a0 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e  ){.    /* nothin
336b0 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
336c0 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  se if( SQLITE_OK
336d0 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
336e0 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62  ursors(pBt, iTab
336f0 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f  le, 0)) ){.    /
33700 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
33710 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
33720 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
33730 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  sePage(pBt, (Pgn
33740 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 70 6e 43  o)iTable, 0, pnC
33750 68 61 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71  hange);.  }.  sq
33760 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
33770 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
33780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
33790 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
337a0 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61  in a table and a
337b0 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  dd the root of t
337c0 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74  he table to.** t
337d0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78  he freelist.  Ex
337e0 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f  cept, the root o
337f0 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20  f the principle 
33800 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f  table (the one o
33810 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20  n.** page 1) is 
33820 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 74  never added to t
33830 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
33840 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33850 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
33860 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
33870 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
33880 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e  en.** cursors on
33890 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
338a0 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20  * If AUTOVACUUM 
338b0 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74  is enabled and t
338c0 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62 6c  he page at iTabl
338d0 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  e is not the las
338e0 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69  t.** root page i
338f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
33900 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  ile, then the la
33910 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a  st root page .**
33920 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
33930 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69   file is moved i
33940 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72  nto the slot for
33950 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
33960 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20  y.** iTable and 
33970 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66  that last slot f
33980 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64  ormerly occupied
33990 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f   by the last roo
339a0 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64  t page.** is add
339b0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
339c0 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54  st instead of iT
339d0 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73  able.  In this s
339e0 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20  ay, all.** root 
339f0 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20 61  pages are kept a
33a00 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
33a10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
33a20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69  file, which.** i
33a30 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
33a40 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f  AUTOVACUUM to wo
33a50 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f  rk right.  *piMo
33a60 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  ved is set to th
33a70 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  e .** page numbe
33a80 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20 62  r that used to b
33a90 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  e the last root 
33aa0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
33ab0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d   before.** the m
33ac0 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65  ove.  If no page
33ad0 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69   gets moved, *pi
33ae0 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
33af0 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72  0..** The last r
33b00 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63 6f  oot page is reco
33b10 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20  rded in meta[3] 
33b20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
33b30 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75  .** meta[3] is u
33b40 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20 70  pdated by this p
33b50 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61  rocedure..*/.sta
33b60 74 69 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f  tic int btreeDro
33b70 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  pTable(Btree *p,
33b80 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 69 6e   Pgno iTable, in
33b90 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
33ba0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
33bb0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42   *pPage = 0;.  B
33bc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
33bd0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
33be0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
33bf0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
33c00 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
33c10 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
33c20 20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   );..  /* It is 
33c30 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20  illegal to drop 
33c40 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63  a table if any c
33c50 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20  ursors are open 
33c60 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
33c70 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65  base. This is be
33c80 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  cause in auto-va
33c90 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61  cuum mode the ba
33ca0 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e  ckend may.  ** n
33cb0 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74  eed to move anot
33cc0 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f  her root-page to
33cd0 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74   fill a gap left
33ce0 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a   by the deleted.
33cf0 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20    ** root page. 
33d00 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  If an open curso
33d10 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73  r was using this
33d20 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20   page a problem 
33d30 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75  would .  ** occu
33d40 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
33d50 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  t->pCursor ){.  
33d60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33d70 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72  LOCKED;.  }..  r
33d80 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
33d90 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67  GetPage(pBt, (Pg
33da0 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67  no)iTable, &pPag
33db0 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  e, 0);.  if( rc 
33dc0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
33dd0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
33de0 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54  ClearTable(p, iT
33df0 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  able, 0);.  if( 
33e00 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  rc ){.    releas
33e10 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
33e20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
33e30 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30  ..  *piMoved = 0
33e40 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e  ;..  if( iTable>
33e50 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  1 ){.#ifdef SQLI
33e60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33e70 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  UM.    rc = free
33e80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
33e90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
33ea0 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ge);.#else.    i
33eb0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
33ec0 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  um ){.      Pgno
33ed0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
33ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33ef0 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
33f00 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  4, &maxRootPgno)
33f10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33f30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
33f40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
33f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33f60 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
33f70 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67  Table==maxRootPg
33f80 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  no ){.        /*
33f90 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   If the table be
33fa0 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74  ing dropped is t
33fb0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
33fc0 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
33fd0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
33fe0 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
33ff0 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72  abase, put the r
34000 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20  oot page on the 
34010 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20  free list. .    
34020 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
34030 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
34040 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
34050 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
34060 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
34070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34080 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
34090 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
340a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
340b0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
340c0 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65  eing dropped doe
340d0 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c  s not have the l
340e0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
340f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
34100 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
34110 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20  se. So move the 
34120 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69  page that does i
34130 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20  nto the .       
34140 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20   ** gap left by 
34150 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74  the deleted root
34160 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a  -page..        *
34170 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  /.        MemPag
34180 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20  e *pMove;.      
34190 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
341a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  age);.        rc
341b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
341c0 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52  etPage(pBt, maxR
341d0 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c  ootPgno, &pMove,
341e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
341f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34200 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
34210 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
34220 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
34230 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
34240 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f  pMove, PTRMAP_RO
34250 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c  OTPAGE, 0, iTabl
34260 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  e, 0);.        r
34270 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
34280 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
342a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
342b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
342c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
342d0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
342e0 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
342f0 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  , &pMove, 0);.  
34300 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34320 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
34330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34340 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
34350 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
34360 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76  releasePage(pMov
34370 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
34380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34390 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
343a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
343b0 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64          *piMoved
343c0 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a   = maxRootPgno;.
343d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
343e0 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d  * Set the new 'm
343f0 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61  ax-root-page' va
34400 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  lue in the datab
34410 61 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73  ase header. This
34420 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
34430 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20   old value less 
34440 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f  one, less one mo
34450 72 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65  re if that happe
34460 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  ns to.      ** b
34470 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  e a root-page nu
34480 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61  mber, less one a
34490 67 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20  gain if that is 
344a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e  the.      ** PEN
344b0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a  DING_BYTE_PAGE..
344c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
344d0 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
344e0 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
344f0 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
34500 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
34510 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67         maxRootPg
34520 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no--;.      }.  
34530 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
34540 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  gno==PTRMAP_PAGE
34550 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  NO(pBt, maxRootP
34560 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gno) ){.        
34570 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
34580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
34590 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  ert( maxRootPgno
345a0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
345b0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  AGE(pBt) );..   
345c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
345d0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
345e0 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  , 4, maxRootPgno
345f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34600 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
34610 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
34620 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
34630 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
34640 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
34650 20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   If sqlite3Btree
34660 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61  DropTable was ca
34670 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20  lled on page 1. 
34680 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  */.    zeroPage(
34690 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45  pPage, PTF_INTKE
346a0 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20  Y|PTF_LEAF );.  
346b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
346c0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
346d0 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
346e0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
346f0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
34700 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
34710 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  piMoved){.  int 
34720 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
34730 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
34740 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
34750 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72  ;.  rc = btreeDr
34760 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  opTable(p, iTabl
34770 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73  e, piMoved);.  s
34780 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34790 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
347a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
347b0 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d   the meta-inform
347c0 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64  ation out of a d
347d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d  atabase file.  M
347e0 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65  eta[0].** is the
347f0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
34800 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
34810 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
34820 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72    Meta[1].** thr
34830 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72  ough meta[15] ar
34840 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  e available for 
34850 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61  use by higher la
34860 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  yers.  Meta[0].*
34870 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  * is read-only, 
34880 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72  the others are r
34890 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a  ead/write..** .*
348a0 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79  * The schema lay
348b0 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20  er numbers meta 
348c0 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74  values different
348d0 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65  ly.  At the sche
348e0 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64  ma.** layer (and
348f0 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61   the SetCookie a
34900 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70  nd ReadCookie op
34910 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65  codes) the numbe
34920 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67  r of.** free pag
34930 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c  es is not visibl
34940 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d  e.  So Cookie[0]
34950 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
34960 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20  Meta[1]..*/.int 
34970 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
34980 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
34990 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74  t idx, u32 *pMet
349a0 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  a){.  DbPage *pD
349b0 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  bPage = 0;.  int
349c0 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
349d0 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53  char *pP1;.  BtS
349e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
349f0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
34a00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
34a10 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
34a20 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61  ..  /* Reading a
34a30 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65   meta-data value
34a40 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64   requires a read
34a50 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20  -lock on page 1 
34a60 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20  (and hence.  ** 
34a70 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
34a80 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62  r table. We grab
34a90 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72   this lock regar
34aa0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
34ab0 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65   or.  ** not the
34ac0 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
34ad0 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
34ae0 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72  set (the table r
34af0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20  ooted at page.  
34b00 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20  ** 1 is treated 
34b10 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
34b20 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c  e by queryTableL
34b30 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61  ock() and lockTa
34b40 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72  ble())..  */.  r
34b50 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
34b60 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  ck(p, 1, READ_LO
34b70 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
34b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34b90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
34ba0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
34bb0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
34bc0 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
34bd0 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20 70  x<=15 );.  if( p
34be0 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20 20  Bt->pPage1 ){.  
34bf0 20 20 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20    /* The b-tree 
34c00 69 73 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 69  is already holdi
34c10 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
34c20 6f 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  o page 1 of the 
34c30 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
34c40 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  file. In this ca
34c50 73 65 20 74 68 65 20 72 65 71 75 69 72 65 64 20  se the required 
34c60 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20  meta-data value 
34c70 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
34c80 63 74 6c 79 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  ctly.    ** from
34c90 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 6f   the page data o
34ca0 66 20 74 68 69 73 20 72 65 66 65 72 65 6e 63 65  f this reference
34cb0 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74  . This is slight
34cc0 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 0a 20  ly faster than. 
34cd0 20 20 20 2a 2a 20 72 65 71 75 65 73 74 69 6e 67     ** requesting
34ce0 20 61 20 6e 65 77 20 72 65 66 65 72 65 6e 63 65   a new reference
34cf0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
34d00 6c 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  layer..    */.  
34d10 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65    pP1 = (unsigne
34d20 64 20 63 68 61 72 20 2a 29 70 42 74 2d 3e 70 50  d char *)pBt->pP
34d30 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 7d  age1->aData;.  }
34d40 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
34d50 20 62 2d 74 72 65 65 20 64 6f 65 73 20 6e 6f 74   b-tree does not
34d60 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
34d70 65 20 74 6f 20 70 61 67 65 20 31 20 6f 66 20 74  e to page 1 of t
34d80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34d90 2e 0a 20 20 20 20 2a 2a 20 4f 62 74 61 69 6e 20  ..    ** Obtain 
34da0 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  one from the pag
34db0 65 72 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a 2f  er layer..    */
34dc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34dd0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
34de0 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61  Pager, 1, &pDbPa
34df0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
34e00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
34e10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
34e20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
34e30 20 20 20 20 7d 0a 20 20 20 20 70 50 31 20 3d 20      }.    pP1 = 
34e40 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
34e50 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
34e60 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
34e70 20 7d 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65   }.  *pMeta = ge
34e80 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
34e90 20 69 64 78 2a 34 5d 29 3b 0a 0a 20 20 2f 2a 20   idx*4]);..  /* 
34ea0 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  If the b-tree is
34eb0 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 72   not holding a r
34ec0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
34ed0 20 31 2c 20 74 68 65 6e 20 6f 6e 65 20 77 61 73   1, then one was
34ee0 20 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64   .  ** requested
34ef0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
34f00 6c 61 79 65 72 20 69 6e 20 74 68 65 20 61 62 6f  layer in the abo
34f10 76 65 20 62 6c 6f 63 6b 2e 20 52 65 6c 65 61 73  ve block. Releas
34f20 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  e it now..  */. 
34f30 20 69 66 28 20 21 70 42 74 2d 3e 70 50 61 67 65   if( !pBt->pPage
34f40 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
34f50 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
34f60 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
34f70 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69  f autovacuumed i
34f80 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
34f90 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20  is build but we 
34fa0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20  are trying to . 
34fb0 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75   ** access an au
34fc0 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62  tovacuumed datab
34fd0 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  ase, then make t
34fe0 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64  he database read
34ff0 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64  only. .  */.#ifd
35000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
35010 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
35020 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61  idx==4 && *pMeta
35030 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e  >0 ) pBt->readOn
35040 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  ly = 1;.#endif..
35050 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65    /* Grab the re
35060 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
35070 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63  1. */.  rc = loc
35080 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41  kTable(p, 1, REA
35090 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74  D_LOCK);.  sqlit
350a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
350b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
350c0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74  ./*.** Write met
350d0 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61  a-information ba
350e0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
350f0 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69  base.  Meta[0] i
35100 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61  s.** read-only a
35110 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72  nd may not be wr
35120 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  itten..*/.int sq
35130 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
35140 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69  Meta(Btree *p, i
35150 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74  nt idx, u32 iMet
35160 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  a){.  BtShared *
35170 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
35180 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
35190 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  P1;.  int rc;.  
351a0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26  assert( idx>=1 &
351b0 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73  & idx<=15 );.  s
351c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
351d0 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
351e0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
351f0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
35200 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
35210 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
35220 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d  e1!=0 );.  pP1 =
35230 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
35240 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
35250 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
35260 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
35270 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
35280 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35290 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  put4byte(&pP1[36
352a0 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61   + idx*4], iMeta
352b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
352c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
352d0 4d 0a 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37  M.    if( idx==7
352e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
352f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
35300 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b  m || iMeta==0 );
35310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
35320 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61  Meta==0 || iMeta
35330 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ==1 );.      pBt
35340 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
35350 75 38 29 69 4d 65 74 61 3b 0a 20 20 20 20 7d 0a  u8)iMeta;.    }.
35360 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
35370 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
35380 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
35390 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
353a0 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74  the flag byte at
353b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
353c0 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
353d0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  the cursor.** is
353e0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
353f0 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  ing to..*/.int s
35400 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73  qlite3BtreeFlags
35410 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
35420 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
35430 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52  t about CURSOR_R
35440 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
35450 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20  ? Probably need 
35460 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73  to call.  ** res
35470 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
35480 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a  on() here..  */.
35490 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
354a0 3b 0a 20 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ;.  restoreCurso
354b0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
354c0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
354d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
354e0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
354f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
35500 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
35510 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
35520 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35530 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20  >pBt==pCur->pBt 
35540 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
35550 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
35560 68 64 72 4f 66 66 73 65 74 5d 3b 0a 7d 0a 0a 23  hdrOffset];.}..#
35570 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35580 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 2f 2a  IT_BTREECOUNT./*
35590 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
355a0 67 75 6d 65 6e 74 2c 20 70 43 75 72 2c 20 69 73  gument, pCur, is
355b0 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
355c0 20 6f 6e 20 73 6f 6d 65 20 62 2d 74 72 65 65 2e   on some b-tree.
355d0 20 43 6f 75 6e 74 20 74 68 65 0a 2a 2a 20 6e 75   Count the.** nu
355e0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
355f0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 61 6e  in the b-tree an
35600 64 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  d write the resu
35610 6c 74 20 74 6f 20 2a 70 6e 45 6e 74 72 79 2e 0a  lt to *pnEntry..
35620 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
35630 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
35640 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
35650 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 78 65  successfully exe
35660 63 75 74 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  cuted. .** Other
35670 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
35680 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
35690 20 28 69 2e 65 2e 20 61 6e 20 49 4f 20 65 72 72   (i.e. an IO err
356a0 6f 72 20 6f 72 20 64 61 74 61 62 61 73 65 0a 2a  or or database.*
356b0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 29 20 61 6e  * corruption) an
356c0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
356d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
356e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
356f0 72 65 65 43 6f 75 6e 74 28 42 74 43 75 72 73 6f  reeCount(BtCurso
35700 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 6e  r *pCur, i64 *pn
35710 45 6e 74 72 79 29 7b 0a 20 20 69 36 34 20 6e 45  Entry){.  i64 nE
35720 6e 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  ntry = 0;       
35730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35740 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
35750 6e 20 69 6e 20 2a 70 6e 45 6e 74 72 79 20 2a 2f  n in *pnEntry */
35760 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
35770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35780 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
35790 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 72 63 20 3d  n code */.  rc =
357a0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
357b0 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20  );..  /* Unless 
357c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
357d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   the following l
357e0 6f 6f 70 20 72 75 6e 73 20 6f 6e 65 20 69 74 65  oop runs one ite
357f0 72 61 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 0a  ration for each.
35800 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
35810 20 42 2d 54 72 65 65 20 73 74 72 75 63 74 75 72   B-Tree structur
35820 65 20 28 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  e (not including
35830 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
35840 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
35850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35860 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b 20  {.    int iIdx; 
35870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35880 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
35890 78 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64 65 20  x of child node 
358a0 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 20  in parent */.   
358b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
358c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358d0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70      /* Current p
358e0 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
358f0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  e */..    /* If 
35900 74 68 69 73 20 69 73 20 61 20 6c 65 61 66 20 70  this is a leaf p
35910 61 67 65 20 6f 72 20 74 68 65 20 74 72 65 65 20  age or the tree 
35920 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 2d 6b 65  is not an int-ke
35930 79 20 74 72 65 65 2c 20 74 68 65 6e 20 0a 20 20  y tree, then .  
35940 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 63    ** this page c
35950 6f 6e 74 61 69 6e 73 20 63 6f 75 6e 74 61 62 6c  ontains countabl
35960 65 20 65 6e 74 72 69 65 73 2e 20 49 6e 63 72 65  e entries. Incre
35970 6d 65 6e 74 20 74 68 65 20 65 6e 74 72 79 20 63  ment the entry c
35980 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20 61 63  ounter.    ** ac
35990 63 6f 72 64 69 6e 67 6c 79 2e 0a 20 20 20 20 2a  cordingly..    *
359a0 2f 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  /.    pPage = pC
359b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
359c0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
359d0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
359e0 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
359f0 7b 0a 20 20 20 20 20 20 6e 45 6e 74 72 79 20 2b  {.      nEntry +
35a00 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
35a10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 50      }..    /* pP
35a20 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6e 6f  age is a leaf no
35a30 64 65 2e 20 54 68 69 73 20 6c 6f 6f 70 20 6e 61  de. This loop na
35a40 76 69 67 61 74 65 73 20 74 68 65 20 63 75 72 73  vigates the curs
35a50 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 0a 20  or so that it . 
35a60 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20     ** points to 
35a70 74 68 65 20 66 69 72 73 74 20 69 6e 74 65 72 69  the first interi
35a80 6f 72 20 63 65 6c 6c 20 74 68 61 74 20 69 74 20  or cell that it 
35a90 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 61  points to the pa
35aa0 72 65 6e 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74  rent of.    ** t
35ab0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
35ac0 74 68 65 20 74 72 65 65 20 74 68 61 74 20 68 61  the tree that ha
35ad0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 76  s not yet been v
35ae0 69 73 69 74 65 64 2e 20 54 68 65 0a 20 20 20 20  isited. The.    
35af0 2a 2a 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  ** pCur->aiIdx[p
35b00 43 75 72 2d 3e 69 50 61 67 65 5d 20 76 61 6c 75  Cur->iPage] valu
35b10 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
35b20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 70 61 72  index of the par
35b30 65 6e 74 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20  ent cell.    ** 
35b40 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  of the page, or 
35b50 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
35b60 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61   cells in the pa
35b70 67 65 20 69 66 20 74 68 65 20 6e 65 78 74 20 70  ge if the next p
35b80 61 67 65 0a 20 20 20 20 2a 2a 20 74 6f 20 76 69  age.    ** to vi
35b90 73 69 74 20 69 73 20 74 68 65 20 72 69 67 68 74  sit is the right
35ba0 2d 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61  -child of its pa
35bb0 72 65 6e 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rent..    **.   
35bc0 20 2a 2a 20 49 66 20 61 6c 6c 20 70 61 67 65 73   ** If all pages
35bd0 20 69 6e 20 74 68 65 20 74 72 65 65 20 68 61 76   in the tree hav
35be0 65 20 62 65 65 6e 20 76 69 73 69 74 65 64 2c 20  e been visited, 
35bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35c00 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   to the.    ** c
35c10 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  aller..    */.  
35c20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
35c30 66 20 29 7b 0a 20 20 20 20 20 20 64 6f 20 7b 0a  f ){.      do {.
35c40 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
35c50 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
35c60 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 70          /* All p
35c70 61 67 65 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ages of the b-tr
35c80 65 65 20 68 61 76 65 20 62 65 65 6e 20 76 69 73  ee have been vis
35c90 69 74 65 64 2e 20 52 65 74 75 72 6e 20 73 75 63  ited. Return suc
35ca0 63 65 73 73 66 75 6c 6c 79 2e 20 2a 2f 0a 20 20  cessfully. */.  
35cb0 20 20 20 20 20 20 20 20 2a 70 6e 45 6e 74 72 79          *pnEntry
35cc0 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 20 20 20   = nEntry;.     
35cd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35ce0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
35cf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35d00 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
35d10 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  t(pCur);.      }
35d20 77 68 69 6c 65 20 28 20 70 43 75 72 2d 3e 61 69  while ( pCur->ai
35d30 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
35d40 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  >=pCur->apPage[p
35d50 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
35d60 6c 6c 20 29 3b 0a 0a 20 20 20 20 20 20 70 43 75  ll );..      pCu
35d70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
35d80 50 61 67 65 5d 2b 2b 3b 0a 20 20 20 20 20 20 70  Page]++;.      p
35d90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
35da0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
35db0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
35dc0 44 65 73 63 65 6e 64 20 74 6f 20 74 68 65 20 63  Descend to the c
35dd0 68 69 6c 64 20 6e 6f 64 65 20 6f 66 20 74 68 65  hild node of the
35de0 20 63 65 6c 6c 20 74 68 61 74 20 74 68 65 20 63   cell that the c
35df0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
35e00 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 61  .    ** points a
35e10 74 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72  t. This is the r
35e20 69 67 68 74 2d 63 68 69 6c 64 20 69 66 20 28 69  ight-child if (i
35e30 49 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  Idx==pPage->nCel
35e40 6c 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  l)..    */.    i
35e50 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  Idx = pCur->aiId
35e60 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
35e70 20 20 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50      if( iIdx==pP
35e80 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
35e90 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
35ea0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
35eb0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
35ec0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
35ed0 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 7d 65 6c  et+8]));.    }el
35ee0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  se{.      rc = m
35ef0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
35f00 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
35f10 6c 6c 28 70 50 61 67 65 2c 20 69 49 64 78 29 29  ll(pPage, iIdx))
35f20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
35f30 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
35f40 6f 63 63 75 72 65 64 2e 20 52 65 74 75 72 6e 20  occured. Return 
35f50 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a  an error code. *
35f60 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
35f70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
35f80 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20  eturn the pager 
35f90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35fa0 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72  a BTree.  This r
35fb0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
35fc0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
35fd0 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
35fe0 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69  ..*/.Pager *sqli
35ff0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74  te3BtreePager(Bt
36000 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
36010 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  n p->pBt->pPager
36020 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
36030 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
36040 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41  TY_CHECK./*.** A
36050 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67 65 20  ppend a message 
36060 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
36070 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  sage string..*/.
36080 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
36090 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e  kAppendMsg(.  In
360a0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
360b0 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 31  k,.  char *zMsg1
360c0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
360d0 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29  zFormat,.  ....)
360e0 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
360f0 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d    if( !pCheck->m
36100 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  xErr ) return;. 
36110 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d   pCheck->mxErr--
36120 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72  ;.  pCheck->nErr
36130 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ++;.  va_start(a
36140 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69  p, zFormat);.  i
36150 66 28 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73  f( pCheck->errMs
36160 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20 73  g.nChar ){.    s
36170 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
36180 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72  pend(&pCheck->er
36190 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a  rMsg, "\n", 1);.
361a0 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73 67 31 20    }.  if( zMsg1 
361b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  ){.    sqlite3St
361c0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70 43  rAccumAppend(&pC
361d0 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 7a 4d  heck->errMsg, zM
361e0 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20  sg1, -1);.  }.  
361f0 73 71 6c 69 74 65 33 56 58 50 72 69 6e 74 66 28  sqlite3VXPrintf(
36200 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
36210 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29   1, zFormat, ap)
36220 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
36230 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72    if( pCheck->er
36240 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65  rMsg.mallocFaile
36250 64 20 29 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d  d ){.    pCheck-
36260 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
36270 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  1;.  }.}.#endif 
36280 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
36290 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
362a0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
362b0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
362c0 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64  _CHECK./*.** Add
362d0 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65   1 to the refere
362e0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
362f0 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68  ge iPage.  If th
36300 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
36310 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
36320 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61   the page, add a
36330 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
36340 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  to pCheck->zErrM
36350 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  sg..** Return 1 
36360 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f  if there are 2 o
36370 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63  re more referenc
36380 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  es to the page a
36390 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68  nd 0 if.** if th
363a0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
363b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
363c0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73   page..**.** Als
363d0 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
363e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
363f0 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74  in bounds..*/.st
36400 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
36410 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70  f(IntegrityCk *p
36420 43 68 65 63 6b 2c 20 50 67 6e 6f 20 69 50 61 67  Check, Pgno iPag
36430 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  e, char *zContex
36440 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  t){.  if( iPage=
36450 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
36460 20 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63   if( iPage>pChec
36470 6b 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  k->nPage ){.    
36480 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
36490 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
364a0 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e   "invalid page n
364b0 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65  umber %d", iPage
364c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
364d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63  .  }.  if( pChec
364e0 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d  k->anRef[iPage]=
364f0 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =1 ){.    checkA
36500 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
36510 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20   zContext, "2nd 
36520 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
36530 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
36540 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
36550 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65  .  return  (pChe
36560 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d  ck->anRef[iPage]
36570 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ++)>1;.}..#ifnde
36580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
36590 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43  TOVACUUM./*.** C
365a0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e  heck that the en
365b0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
365c0 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20  er-map for page 
365d0 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a  iChild maps to .
365e0 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c  ** page iParent,
365f0 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74   pointer type pt
36600 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61  rType. If not, a
36610 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  ppend an error m
36620 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68  essage.** to pCh
36630 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eck..*/.static v
36640 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28  oid checkPtrmap(
36650 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
36660 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74  pCheck,   /* Int
36670 65 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e  egrity check con
36680 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  text */.  Pgno i
36690 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Child,          
366a0 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e   /* Child page n
366b0 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54  umber */.  u8 eT
366c0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
366d0 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f    /* Expected po
366e0 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a  inter map type *
366f0 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74  /.  Pgno iParent
36700 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ,          /* Ex
36710 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d  pected pointer m
36720 61 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  ap parent page n
36730 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
36740 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
36750 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73    /* Context des
36760 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66  cription (used f
36770 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f  or error msg) */
36780 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
36790 75 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a  u8 ePtrmapType;.
367a0 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61    Pgno iPtrmapPa
367b0 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74  rent;..  rc = pt
367c0 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e  rmapGet(pCheck->
367d0 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50  pBt, iChild, &eP
367e0 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72  trmapType, &iPtr
367f0 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  mapParent);.  if
36800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36810 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
36820 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 70 43  QLITE_NOMEM ) pC
36830 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  heck->mallocFail
36840 65 64 20 3d 20 31 3b 0a 20 20 20 20 63 68 65 63  ed = 1;.    chec
36850 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
36860 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61  k, zContext, "Fa
36870 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72  iled to read ptr
36880 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68  map key=%d", iCh
36890 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
368a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74  ;.  }..  if( ePt
368b0 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20  rmapType!=eType 
368c0 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  || iPtrmapParent
368d0 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  !=iParent ){.   
368e0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
368f0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
36900 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74  , .      "Bad pt
36910 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d  r map entry key=
36920 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c  %d expected=(%d,
36930 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22  %d) got=(%d,%d)"
36940 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c  , .      iChild,
36950 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c   eType, iParent,
36960 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50   ePtrmapType, iP
36970 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
36980 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
36990 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
369a0 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
369b0 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f  elist or of an o
369c0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
369d0 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  t..** Verify tha
369e0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
369f0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73  pages on the lis
36a00 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  t is N..*/.stati
36a10 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74  c void checkList
36a20 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
36a30 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74  *pCheck,  /* Int
36a40 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
36a50 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
36a60 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20   isFreeList,    
36a70 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
36a80 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73   freelist.  Fals
36a90 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e for overflow p
36aa0 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  age list */.  in
36ab0 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
36ac0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
36ad0 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  er for first pag
36ae0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  e in the list */
36af0 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
36b00 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
36b10 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70  cted number of p
36b20 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
36b30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
36b40 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43  text        /* C
36b50 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
36b60 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a   messages */.){.
36b70 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65    int i;.  int e
36b80 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69  xpected = N;.  i
36b90 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67  nt iFirst = iPag
36ba0 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  e;.  while( N-- 
36bb0 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  > 0 && pCheck->m
36bc0 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61  xErr ){.    DbPa
36bd0 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20  ge *pOvflPage;. 
36be0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
36bf0 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20   *pOvflData;.   
36c00 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
36c10 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
36c20 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
36c30 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
36c40 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
36c50 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
36c60 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
36c70 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
36c80 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
36c90 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
36ca0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
36cb0 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
36cc0 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
36cd0 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
36ce0 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
36cf0 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65  te3PagerGet(pChe
36d00 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e  ck->pPager, (Pgn
36d10 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50  o)iPage, &pOvflP
36d20 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  age) ){.      ch
36d30 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
36d40 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
36d50 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61  failed to get pa
36d60 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
36d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36d80 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61   }.    pOvflData
36d90 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
36da0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
36db0 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67  GetData(pOvflPag
36dc0 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72  e);.    if( isFr
36dd0 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  eeList ){.      
36de0 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65  int n = get4byte
36df0 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b  (&pOvflData[4]);
36e00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36e10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
36e20 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
36e30 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
36e40 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
36e50 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
36e60 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
36e70 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
36e80 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
36e90 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
36ea0 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
36eb0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b  sableSize/4-2 ){
36ec0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
36ed0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
36ee0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
36ef0 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
36f00 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
36f10 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
36f20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
36f30 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
36f40 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
36f50 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
36f60 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
36f70 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
36f80 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a  (&pOvflData[8+i*
36f90 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
36fa0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
36fb0 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66  UUM.          if
36fc0 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
36fd0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
36fe0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74           checkPt
36ff0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72  rmap(pCheck, iFr
37000 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46  eePage, PTRMAP_F
37010 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
37020 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
37030 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
37040 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68      checkRef(pCh
37050 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
37060 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
37070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d     }.        N -
37080 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
37090 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
370a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
370b0 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  M.    else{.    
370c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
370d0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
370e0 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69  uto-vacuum and i
370f0 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Page is not the 
37100 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61  last.      ** pa
37110 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66  ge in this overf
37120 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20  low list, check 
37130 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72  that the pointer
37140 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20  -map entry for. 
37150 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
37160 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68  owing page match
37170 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20  es iPage..      
37180 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  */.      if( pCh
37190 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
371a0 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20  cuum && N>0 ){. 
371b0 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62         i = get4b
371c0 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
371d0 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
371e0 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
371f0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
37200 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
37210 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37220 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
37230 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
37240 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  flData);.    sql
37250 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
37260 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  OvflPage);.  }.}
37270 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
37280 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
37290 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
372a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
372b0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
372c0 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20  *.** Do various 
372d0 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  sanity checks on
372e0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
372f0 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72  f a tree.  Retur
37300 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65  n.** the tree de
37310 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73  pth.  Root pages
37320 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65   return 0.  Pare
37330 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  nts of root page
37340 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61  s.** return 1, a
37350 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20  nd so forth..** 
37360 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73  .** These checks
37370 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a   are done:.**.**
37380 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73        1.  Make s
37390 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61  ure that cells a
373a0 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f  nd freeblocks do
373b0 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20   not overlap.** 
373c0 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d           but com
373d0 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  bine to complete
373e0 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67  ly cover the pag
373f0 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d  e..**  NO  2.  M
37400 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65  ake sure cell ke
37410 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e  ys are in order.
37420 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b  .**  NO  3.  Mak
37430 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
37440 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
37450 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75  ual to zLowerBou
37460 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20  nd..**  NO  4.  
37470 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
37480 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
37490 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70   or equal to zUp
374a0 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20  perBound..**    
374b0 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20    5.  Check the 
374c0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65  integrity of ove
374d0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20  rflow pages..** 
374e0 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69       6.  Recursi
374f0 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54  vely call checkT
37500 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63  reePage on all c
37510 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20  hildren..**     
37520 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74   7.  Verify that
37530 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c   the depth of al
37540 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68  l children is th
37550 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20  e same..**      
37560 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  8.  Make sure th
37570 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65  is page is at le
37580 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20  ast 33% full or 
37590 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20  else it is.**   
375a0 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20         the root 
375b0 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  of the tree..*/.
375c0 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
375d0 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65  TreePage(.  Inte
375e0 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
375f0 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
37600 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
37610 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  k */.  int iPage
37620 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
37630 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
37640 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b  he page to check
37650 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72   */.  char *zPar
37660 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50  entContext  /* P
37670 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f  arent context */
37680 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
37690 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72  Page;.  int i, r
376a0 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67  c, depth, d2, pg
376b0 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68  no, cnt;.  int h
376c0 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20  dr, cellStart;. 
376d0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38   int nCell;.  u8
376e0 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72   *data;.  BtShar
376f0 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75  ed *pBt;.  int u
37700 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61  sableSize;.  cha
37710 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b  r zContext[100];
37720 0a 20 20 63 68 61 72 20 2a 68 69 74 20 3d 20 30  .  char *hit = 0
37730 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
37740 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
37750 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
37760 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69  , "Page %d: ", i
37770 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  Page);..  /* Che
37780 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
37790 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70   exists.  */.  p
377a0 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74  Bt = pCheck->pBt
377b0 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
377c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
377d0 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30  ;.  if( iPage==0
377e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
377f0 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65  f( checkRef(pChe
37800 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65  ck, iPage, zPare
37810 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74  ntContext) ) ret
37820 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63  urn 0;.  if( (rc
37830 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
37840 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
37850 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  o)iPage, &pPage,
37860 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69   0))!=0 ){.    i
37870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
37880 4d 45 4d 20 29 20 70 43 68 65 63 6b 2d 3e 6d 61  MEM ) pCheck->ma
37890 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
378a0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
378b0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
378c0 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61  ext,.       "una
378d0 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70  ble to get the p
378e0 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d  age. error code=
378f0 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  %d", rc);.    re
37900 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
37910 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  ( (rc = sqlite3B
37920 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
37930 67 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 61  ge))!=0 ){.    a
37940 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37950 45 5f 43 4f 52 52 55 50 54 20 29 3b 20 20 2f 2a  E_CORRUPT );  /*
37960 20 54 68 65 20 6f 6e 6c 79 20 70 6f 73 73 69 62   The only possib
37970 6c 65 20 65 72 72 6f 72 20 66 72 6f 6d 20 49 6e  le error from In
37980 69 74 50 61 67 65 20 2a 2f 0a 20 20 20 20 63 68  itPage */.    ch
37990 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
379a0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  eck, zContext, .
379b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379c0 20 20 20 22 73 71 6c 69 74 65 33 42 74 72 65 65     "sqlite3Btree
379d0 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72  InitPage() retur
379e0 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64  ns error code %d
379f0 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65  ", rc);.    rele
37a00 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
37a10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
37a20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75  }..  /* Check ou
37a30 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e  t all the cells.
37a40 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20  .  */.  depth = 
37a50 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
37a60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20  pPage->nCell && 
37a70 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69  pCheck->mxErr; i
37a80 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
37a90 6c 6c 3b 0a 20 20 20 20 75 33 32 20 73 7a 3b 0a  ll;.    u32 sz;.
37aa0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
37ab0 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  o;..    /* Check
37ac0 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f   payload overflo
37ad0 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20  w pages.    */. 
37ae0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37af0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
37b00 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  ext), zContext,.
37b10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e               "On
37b20 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63 65   tree page %d ce
37b30 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65 2c  ll %d: ", iPage,
37b40 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d   i);.    pCell =
37b50 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
37b60 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  i);.    sqlite3B
37b70 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
37b80 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
37b90 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20  info);.    sz = 
37ba0 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
37bb0 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  if( !pPage->intK
37bc0 65 79 20 29 20 73 7a 20 2b 3d 20 28 69 6e 74 29  ey ) sz += (int)
37bd0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61  info.nKey;.    a
37be0 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e  ssert( sz==info.
37bf0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
37c00 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63  if( sz>info.nLoc
37c10 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  al ){.      int 
37c20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e  nPage = (sz - in
37c30 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62  fo.nLocal + usab
37c40 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61  leSize - 5)/(usa
37c50 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
37c60 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
37c70 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
37c80 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
37c90 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ow]);.#ifndef SQ
37ca0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
37cb0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
37cc0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
37cd0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
37ce0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
37cf0 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
37d00 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c  VERFLOW1, iPage,
37d10 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
37d20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
37d30 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63   checkList(pChec
37d40 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  k, 0, pgnoOvfl, 
37d50 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  nPage, zContext)
37d60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
37d70 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20  Check sanity of 
37d80 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e  left child page.
37d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
37da0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
37db0 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
37dc0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69  4byte(pCell);.#i
37dd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37de0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
37df0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
37e00 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
37e10 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
37e20 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  heck, pgno, PTRM
37e30 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c  AP_BTREE, iPage,
37e40 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
37e50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
37e60 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50   d2 = checkTreeP
37e70 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  age(pCheck, pgno
37e80 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
37e90 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32     if( i>0 && d2
37ea0 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20  !=depth ){.     
37eb0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
37ec0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
37ed0 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20  xt, "Child page 
37ee0 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b  depth differs");
37ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
37f00 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d  epth = d2;.    }
37f10 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
37f20 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
37f30 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
37f40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
37f50 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
37f60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
37f70 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
37f80 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
37f90 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  xt, .           
37fa0 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61            "On pa
37fb0 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63  ge %d at right c
37fc0 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  hild: ", iPage);
37fd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37fe0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
37ff0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
38000 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
38010 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
38020 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
38030 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
38040 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
38050 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
38060 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ge(pCheck, pgno,
38070 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a   zContext);.  }.
38080 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72   .  /* Check for
38090 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61   complete covera
380a0 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  ge of the page. 
380b0 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61   */.  data = pPa
380c0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
380d0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
380e0 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c  set;.  hit = sql
380f0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
38100 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
38110 0a 20 20 69 66 28 20 68 69 74 3d 3d 30 20 29 7b  .  if( hit==0 ){
38120 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c  .    pCheck->mal
38130 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
38140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 31 36 20   }else{.    u16 
38150 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 20 3d 20  contentOffset = 
38160 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
38170 64 72 2b 35 5d 29 3b 0a 20 20 20 20 69 66 20 28  dr+5]);.    if (
38180 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 20 3e 20  contentOffset > 
38190 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20  usableSize) {.  
381a0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
381b0 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
381c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381d0 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20      "Corruption 
381e0 64 65 74 65 63 74 65 64 20 69 6e 20 68 65 61 64  detected in head
381f0 65 72 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  er on page %d",i
38200 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 67  Page,0);.      g
38210 6f 74 6f 20 63 68 65 63 6b 5f 70 61 67 65 5f 61  oto check_page_a
38220 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bort;.    }.    
38230 6d 65 6d 73 65 74 28 68 69 74 2b 63 6f 6e 74 65  memset(hit+conte
38240 6e 74 4f 66 66 73 65 74 2c 20 30 2c 20 75 73 61  ntOffset, 0, usa
38250 62 6c 65 53 69 7a 65 2d 63 6f 6e 74 65 6e 74 4f  bleSize-contentO
38260 66 66 73 65 74 29 3b 0a 20 20 20 20 6d 65 6d 73  ffset);.    mems
38270 65 74 28 68 69 74 2c 20 31 2c 20 63 6f 6e 74 65  et(hit, 1, conte
38280 6e 74 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 6e  ntOffset);.    n
38290 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
382a0 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
382b0 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20 68     cellStart = h
382c0 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
382d0 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72  e->leaf;.    for
382e0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
382f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
38300 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
38310 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32  ta[cellStart+i*2
38320 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20 73 69  ]);.      u16 si
38330 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20  ze = 1024;.     
38340 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
38350 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a 65  ( pc<=usableSize
38360 20 29 7b 0a 20 20 20 20 20 20 20 20 73 69 7a 65   ){.        size
38370 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
38380 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
38390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
383a0 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e  if( (pc+size-1)>
383b0 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70  =usableSize || p
383c0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  c<0 ){.        c
383d0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
383e0 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
383f0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
38400 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
38410 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
38420 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
38430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38440 20 20 20 66 6f 72