/ Hex Artifact Content
Login

Artifact e00268557794be741e26cbca1cd77aa37e53b1cc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 37 31 20 32 30 30 38 2f 30  c,v 1.471 2008/0
0190: 37 2f 30 34 20 31 37 3a 35 32 3a 34 33 20 64 72  7/04 17:52:43 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 53   macro..*/.#if S
0380: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0390: 71 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65  qlite3BtreeTrace
03a0: 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
03b0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
03c0: 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 6e  /.#endif....#ifn
03d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
03e0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
03f0: 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69 6e 64  ** A flag to ind
0400: 69 63 61 74 65 20 77 68 65 74 68 65 72 20 6f 72  icate whether or
0410: 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61 63 68   not shared cach
0420: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 20 41  e is enabled.  A
0430: 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74 20 6f  lso,.** a list o
0440: 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  f BtShared objec
0450: 74 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67  ts that are elig
0460: 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69 63 69  ible for partici
0470: 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61  pation.** in sha
0480: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 20  red cache.  The 
0490: 76 61 72 69 61 62 6c 65 73 20 68 61 76 65 20 66  variables have f
04a0: 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e 67  ile scope during
04b0: 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c 0a   normal builds,.
04c0: 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74 20  ** but the test 
04d0: 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74 6f  harness needs to
04e0: 20 61 63 63 65 73 73 20 74 68 65 73 65 20 76 61   access these va
04f0: 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20 6d 61  riables so we ma
0500: 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f 62 61  ke them.** globa
0510: 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69 6c 64  l for test build
0520: 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
0530: 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65  ITE_TEST.BtShare
0540: 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72 65 64  d *sqlite3Shared
0550: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 69  CacheList = 0;.i
0560: 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  nt sqlite3Shared
0570: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30  CacheEnabled = 0
0580: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42  ;.#else.static B
0590: 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74 65 33  tShared *sqlite3
05a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
05b0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
05c0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
05d0: 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  heEnabled = 0;.#
05e0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
05f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0600: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0620: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0630: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0640: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0650: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0660: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0670: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0680: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
0690: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06b0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06c0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06d0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06e0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
06f0: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0700: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0710: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0720: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0730: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0740: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0750: 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68 61 72  ){.  sqlite3Shar
0760: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
0770: 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74 75 72   enable;.  retur
0780: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
0790: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  endif.../*.** Fo
07a0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
07b0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
07c0: 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42  checkReadLocks(B
07d0: 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20 42 74 43  tree*, Pgno, BtC
07e0: 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b 0a 0a 0a  ursor*, i64);...
07f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
0800: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0810: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75    /*.  ** The fu
0820: 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61 62  nctions queryTab
0830: 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61  leLock(), lockTa
0840: 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b  ble() and unlock
0850: 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a  AllTables().  **
0860: 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74 72   manipulate entr
0870: 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68 61  ies in the BtSha
0880: 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64  red.pLock linked
0890: 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73 74   list used to st
08a0: 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ore.  ** shared-
08b0: 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76 65  cache table leve
08c0: 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65 20  l locks. If the 
08d0: 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69  library is compi
08e0: 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  led with the.  *
08f0: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66  * shared-cache f
0900: 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c  eature disabled,
0910: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f   then there is o
0920: 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65  nly ever one use
0930: 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42  r.  ** of each B
0940: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
0950: 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f  e and so this lo
0960: 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63  cking is not nec
0970: 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f  essary. .  ** So
0980: 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b   define the lock
0990: 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f   related functio
09a0: 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ns as no-ops..  
09b0: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75 65  */.  #define que
09c0: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  ryTableLock(a,b,
09d0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
09e0: 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65  define lockTable
09f0: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0a00: 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f  K.  #define unlo
0a10: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a 23  ckAllTables(a).#
0a20: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0a30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0a40: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51 75  D_CACHE./*.** Qu
0a50: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
0a60: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
0a70: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
0a80: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
0a90: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
0aa0: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
0ab0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
0ac0: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
0ad0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
0ae0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
0af0: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
0b00: 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61 62   calling lockTab
0b10: 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c  le()), or.** SQL
0b20: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
0b30: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
0b40: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
0b50: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
0b60: 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  Tab, u8 eLock){.
0b70: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
0b80: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
0b90: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73  ck *pIter;..  as
0ba0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
0bb0: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
0bc0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
0bd0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
0be0: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
0bf0: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
0c00: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
0c10: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
0c20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
0c30: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
0c40: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
0c50: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
0c60: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
0c70: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
0c80: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
0c90: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
0ca0: 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63 6c    if( pBt->pExcl
0cb0: 75 73 69 76 65 20 26 26 20 70 42 74 2d 3e 70 45  usive && pBt->pE
0cc0: 78 63 6c 75 73 69 76 65 21 3d 70 20 29 7b 0a 20  xclusive!=p ){. 
0cd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0ce0: 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20  _LOCKED;.  }..  
0cf0: 2f 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20 77  /* This (along w
0d00: 69 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ith lockTable())
0d10: 20 69 73 20 77 68 65 72 65 20 74 68 65 20 52 65   is where the Re
0d20: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0d30: 61 67 20 69 73 0a 20 20 2a 2a 20 64 65 61 6c 74  ag is.  ** dealt
0d40: 20 77 69 74 68 2e 20 49 66 20 74 68 65 20 63 61   with. If the ca
0d50: 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e 67  ller is querying
0d60: 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b   for a read-lock
0d70: 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20 69 73   and the flag is
0d80: 0a 20 20 2a 2a 20 73 65 74 2c 20 69 74 20 69 73  .  ** set, it is
0d90: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79   unconditionally
0da0: 20 67 72 61 6e 74 65 64 20 2d 20 65 76 65 6e 20   granted - even 
0db0: 69 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69  if there are wri
0dc0: 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e  te-locks.  ** on
0dd0: 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61   the table. If a
0de0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72   write-lock is r
0df0: 65 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65  equested, the Re
0e00: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0e10: 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  ag.  ** is not c
0e20: 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a  onsidered..  **.
0e30: 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e    ** In function
0e40: 20 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20 69 66   lockTable(), if
0e50: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
0e60: 64 65 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65  demanded and the
0e70: 20 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d   .  ** ReadUncom
0e80: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
0e90: 65 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20  et, no entry is 
0ea0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63  added to the loc
0eb0: 6b 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42  ks list .  ** (B
0ec0: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a  tShared.pLock)..
0ed0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d    **.  ** To sum
0ee0: 6d 61 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52  marize: If the R
0ef0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
0f00: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
0f10: 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 64 6f   read cursors do
0f20: 0a 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61 74 65  .  ** not create
0f30: 20 6f 72 20 72 65 73 70 65 63 74 20 74 61 62 6c   or respect tabl
0f40: 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f 63  e locks. The loc
0f50: 6b 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 66  king procedure f
0f60: 6f 72 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65  or a .  ** write
0f70: 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74  -cursor does not
0f80: 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
0f90: 69 66 28 20 0a 20 20 20 20 21 70 2d 3e 64 62 20  if( .    !p->db 
0fa0: 7c 7c 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 64  || .    0==(p->d
0fb0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
0fc0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
0fd0: 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d   || .    eLock==
0fe0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20  WRITE_LOCK ||.  
0ff0: 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52    iTab==MASTER_R
1000: 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  OOT.  ){.    for
1010: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1020: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1030: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1040: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
1050: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
1060: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1070: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
1080: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
1090: 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45  ock || eLock!=RE
10a0: 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  AD_LOCK) ){.    
10b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10c0: 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  E_LOCKED;.      
10d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
10e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
1100: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1110: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
1120: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1130: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
1140: 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   Add a lock on t
1150: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
1160: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74  ot-page iTable t
1170: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
1180: 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74  ee used.** by Bt
1190: 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61  ree handle p. Pa
11a0: 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75  rameter eLock mu
11b0: 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45 41  st be either REA
11c0: 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52  D_LOCK or .** WR
11d0: 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ITE_LOCK..**.** 
11e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
11f0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63  urned if the loc
1200: 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65  k is added succe
1210: 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f  ssfully. SQLITE_
1220: 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  BUSY and.** SQLI
1230: 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73  TE_NOMEM may als
1240: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o be returned..*
1250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
1260: 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  kTable(Btree *p,
1270: 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38   Pgno iTable, u8
1280: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
1290: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12a0: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  t;.  BtLock *pLo
12b0: 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b  ck = 0;.  BtLock
12c0: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65   *pIter;..  asse
12d0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
12e0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
12f0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  ..  /* This is a
1300: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68   no-op if the sh
1310: 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f  ared-cache is no
1320: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  t enabled */.  i
1330: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
1340: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1350: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
1360: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
1370: 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  K==queryTableLoc
1380: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
1390: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ck) );..  /* If 
13a0: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
13b0: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
13c0: 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b   and a read-lock
13d0: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a 20   is requested,. 
13e0: 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c 79   ** return early
13f0: 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67 20   without adding 
1400: 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
1410: 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c  BtShared.pLock l
1420: 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63 6f  ist. See.  ** co
1430: 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69 6f  mment in functio
1440: 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  n queryTableLock
1450: 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f  () for more info
1460: 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20 20   on handling .  
1470: 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  ** the ReadUncom
1480: 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a  mitted flag..  *
1490: 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d  /.  if( .    (p-
14a0: 3e 64 62 29 20 26 26 20 0a 20 20 20 20 28 70 2d  >db) && .    (p-
14b0: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
14c0: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
14d0: 64 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63  d) && .    (eLoc
14e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26  k==READ_LOCK) &&
14f0: 0a 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53  .    iTable!=MAS
1500: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
1510: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1520: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  OK;.  }..  /* Fi
1530: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
1540: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
1550: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
1560: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
1570: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1580: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1590: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
15a0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
15b0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
15c0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
15d0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
15e0: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
15f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1600: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
1610: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
1620: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
1630: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
1640: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
1650: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
1660: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
1670: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
1680: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
1690: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
16a0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
16b0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ock *)sqlite3Mal
16c0: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
16d0: 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28  tLock));.    if(
16e0: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   !pLock ){.     
16f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1700: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1710: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20  pLock->iTable = 
1720: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63  iTable;.    pLoc
1730: 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  k->pBtree = p;. 
1740: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
1750: 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1760: 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70    pBt->pLock = p
1770: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Lock;.  }..  /* 
1780: 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65  Set the BtLock.e
1790: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
17a0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
17b0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
17c0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
17d0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68  quested lock. Th
17e0: 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72  is means if a wr
17f0: 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72  ite-lock was alr
1800: 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61  eady held.  ** a
1810: 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72  nd a read-lock r
1820: 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e  equested, we don
1830: 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64  't incorrectly d
1840: 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63  owngrade the loc
1850: 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  k..  */.  assert
1860: 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41  ( WRITE_LOCK>REA
1870: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
1880: 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f  eLock>pLock->eLo
1890: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  ck ){.    pLock-
18a0: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
18b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
18c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
18d0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
18e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
18f0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1900: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1910: 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  CHE./*.** Releas
1920: 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20  e all the table 
1930: 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74  locks (locks obt
1940: 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20  ained via calls 
1950: 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65  to the lockTable
1960: 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29  ().** procedure)
1970: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 68   held by Btree h
1980: 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74  andle p..*/.stat
1990: 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c  ic void unlockAl
19a0: 6c 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70  lTables(Btree *p
19b0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
19c0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
19d0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
19e0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
19f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a00: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1a10: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1a20: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
1a30: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20 20  ==*ppIter );..  
1a40: 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29  while( *ppIter )
1a50: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  {.    BtLock *pL
1a60: 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20  ock = *ppIter;. 
1a70: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1a80: 70 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  pExclusive==0 ||
1a90: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
1aa0: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
1ab0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
1ac0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
1ad0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
1ae0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
1af0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b00: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  pLock);.    }els
1b10: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
1b20: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
1b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1b40: 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76  ( pBt->pExclusiv
1b50: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d  e==p ){.    pBt-
1b60: 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20 30 3b  >pExclusive = 0;
1b70: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
1b80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1b90: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74  RED_CACHE */..st
1ba0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
1bb0: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
1bc0: 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61  Page);  /* Forwa
1bd0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
1be0: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
1bf0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f  at the cursor ho
1c00: 6c 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  lds a mutex on t
1c10: 68 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  he BtShared.*/.#
1c20: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
1c30: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
1c40: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
1c50: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
1c60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c70: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
1c80: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  x);.}.#endif...#
1c90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ca0: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
1cb0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
1cc0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1cd0: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 63 75  ist cache for cu
1ce0: 72 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e  rsor pCur, if an
1cf0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1d00: 64 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  d invalidateOver
1d10: 66 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72 73  flowCache(BtCurs
1d20: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
1d30: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1d40: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1d60: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
1d70: 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1d80: 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w = 0;.}../*.** 
1d90: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
1da0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1db0: 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20  t cache for all 
1dc0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
1dd0: 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  * on the shared 
1de0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
1df0: 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pBt..*/.static v
1e00: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  oid invalidateAl
1e10: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  lOverflowCache(B
1e20: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1e30: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1e40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1e60: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
1e70: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
1e80: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1e90: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
1ea0: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a  erflowCache(p);.
1eb0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64    }.}.#else.  #d
1ec0: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
1ed0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29  OverflowCache(x)
1ee0: 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  .  #define inval
1ef0: 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1f00: 43 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a  Cache(x).#endif.
1f10: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
1f20: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
1f30: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
1f40: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
1f50: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
1f60: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
1f70: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
1f80: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
1f90: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
1fa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
1fb0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1fc0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1fd0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1fe0: 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
1ff0: 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2000: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
2010: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
2020: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2030: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2040: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
2050: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
2060: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
2070: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
2080: 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   is an intKey ta
2090: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62  ble, then the ab
20a0: 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  ove call to Btre
20b0: 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20  eKeySize().  ** 
20c0: 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67  stores the integ
20d0: 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e  er key in pCur->
20e0: 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61  nKey. In this ca
20f0: 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  se this value is
2100: 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69  .  ** all that i
2110: 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65  s required. Othe
2120: 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69  rwise, if pCur i
2130: 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e  s not open on an
2140: 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62   intKey.  ** tab
2150: 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20  le, then malloc 
2160: 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74  space for and st
2170: 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b  ore the pCur->nK
2180: 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20  ey bytes of key 
2190: 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f  .  ** data..  */
21a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21b0: 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d  E_OK && 0==pCur-
21c0: 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b  >pPage->intKey){
21d0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
21e0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
21f0: 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20  pCur->nKey);.   
2200: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
2210: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2220: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
2230: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65   pCur->nKey, pKe
2240: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
2250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2260: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
2270: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
2280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2290: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
22a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
22c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
22d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
22e0: 74 28 20 21 70 43 75 72 2d 3e 70 50 61 67 65 2d  t( !pCur->pPage-
22f0: 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  >intKey || !pCur
2300: 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28  ->pKey );..  if(
2310: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2320: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
2330: 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
2340: 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
2350: 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  = 0;.    pCur->e
2360: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
2370: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
2380: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
2390: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
23a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23b0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
23c0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
23d0: 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74  l cursors except
23e0: 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e   pExcept open on
23f0: 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77   the table .** w
2400: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
2410: 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68  oot. Usually, th
2420: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  is is called jus
2430: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a  t before cursor.
2440: 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73  ** pExcept is us
2450: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
2460: 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c   table (BtreeDel
2470: 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e  ete() or BtreeIn
2480: 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  sert())..*/.stat
2490: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
24a0: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
24b0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
24c0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
24d0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
24e0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
24f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2500: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2510: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
2520: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
2530: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
2540: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
2550: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
2560: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
2570: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
2580: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
2590: 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20  t==iRoot) && .  
25a0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
25b0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
25c0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
25d0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
25e0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  on(p);.      if(
25f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
2600: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2610: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2620: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2640: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
2650: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2660: 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
2670: 20 76 6f 69 64 20 63 6c 65 61 72 43 75 72 73 6f   void clearCurso
2680: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
2690: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
26a0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
26b0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
26c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
26d0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
26e0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
26f0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2700: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
2710: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
2720: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2730: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
2740: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
2750: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
2760: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
2770: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
2780: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
2790: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
27a0: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
27b0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
27c0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
27d0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
27e0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
27f0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
2800: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
2810: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2820: 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61  osition() call a
2830: 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61  fter each .** sa
2840: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
2850: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
2860: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2870: 20 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65   argument - doSe
2880: 65 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74  ek - is false, t
2890: 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a  hen instead of .
28a0: 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65  ** returning the
28b0: 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 73   cursor to its s
28c0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61  aved position, a
28d0: 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ny saved positio
28e0: 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  n is deleted.** 
28f0: 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
2900: 74 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53  tate set to CURS
2910: 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 69  OR_INVALID..*/.i
2920: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
2930: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2940: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
2950: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2960: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
2970: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2980: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2990: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
29a0: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
29b0: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
29c0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29d0: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
29e0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
29f0: 69 70 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  ip;.  }.  pCur->
2a00: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2a10: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
2a20: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2a30: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
2a40: 4b 65 79 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b  Key, 0, pCur->nK
2a50: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
2a60: 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ip);.  if( rc==S
2a70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2a90: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
2aa0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
2ab0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ac0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2ad0: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2ae0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2af0: 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65  ALID );.  }.  re
2b00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
2b10: 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  ine restoreOrCle
2b20: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2b30: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
2b40: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
2b50: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
2b60: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2b70: 52 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  RestoreOrClearCu
2b80: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
2b90: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
2ba0: 49 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66  ITE_OK)..#ifndef
2bb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2bc0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
2bd0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
2be0: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
2bf0: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
2c00: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
2c10: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2c20: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2c30: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2c40: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
2c50: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
2c60: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
2c70: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
2c80: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
2c90: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2ca0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
2cb0: 50 61 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72  Page, iPtrMap, r
2cc0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
2cd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ce0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2cf0: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
2d00: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
2d10: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
2d20: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
2d30: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
2d40: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
2d50: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
2d60: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
2d70: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
2d80: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2d90: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
2da0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
2db0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
2dc0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
2dd0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
2de0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
2df0: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
2e00: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
2e10: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
2e20: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
2e30: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
2e40: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
2e50: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
2e60: 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  no'..** An error
2e70: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2e80: 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  d if something g
2e90: 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72  oes wrong, other
2ea0: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
2eb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
2ec0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
2ed0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
2ee0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
2ef0: 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67  parent){.  DbPag
2f00: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20  e *pDbPage;  /* 
2f10: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
2f20: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50  page */.  u8 *pP
2f30: 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54  trmap;      /* T
2f40: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64  he pointer map d
2f50: 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ata */.  Pgno iP
2f60: 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68  trmap;     /* Th
2f70: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
2f80: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
2f90: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
2fa0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
2fb0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
2fc0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
2fd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2fe0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2ff0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
3000: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
3010: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
3020: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
3030: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
3040: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
3050: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
3060: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
3070: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
3080: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
3090: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
30a0: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
30b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
30c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30d0: 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20  ;.  }.  iPtrmap 
30e0: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
30f0: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
3100: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
3110: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
3120: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
3130: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3140: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
3150: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f  turn rc;.  }.  o
3160: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
3170: 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65  TROFFSET(pBt, ke
3180: 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20  y);.  pPtrmap = 
3190: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
31a0: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
31b0: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
31c0: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
31d0: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
31e0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
31f0: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
3200: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
3210: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
3220: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
3230: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
3240: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3250: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
3260: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
3270: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3280: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
3290: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
32a0: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
32b0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
32c0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
32d0: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
32e0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
32f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3300: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
3310: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
3320: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
3330: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3340: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
3350: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
3360: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
3370: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
3380: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
3390: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
33a0: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
33b0: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
33c0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
33d0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
33e0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
33f0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
3400: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
3410: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
3420: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
3430: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
3440: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
3450: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
3460: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
3470: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
3480: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
3490: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
34a0: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
34b0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
34c0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
34d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
34e0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
34f0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
3500: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
3510: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
3520: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
3530: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3540: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3550: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
3560: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
3570: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
3580: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
3590: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
35a0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
35b0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
35c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
35d0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
35e0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
35f0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
3600: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
3610: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
3620: 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  ET(pBt, key);.  
3630: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
3640: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
3650: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
3660: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
3670: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
3680: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
3690: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
36a0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
36b0: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
36c0: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
36d0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
36e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3700: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
3710: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
3720: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
3730: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
3740: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
3750: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
3760: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
3770: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
3780: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
3790: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
37a0: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
37b0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
37c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
37d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
37e0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
37f0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
3800: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
3810: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
3820: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 70  efine findCell(p
3830: 50 61 67 65 2c 20 69 43 65 6c 6c 29 20 5c 0a 20  Page, iCell) \. 
3840: 20 28 28 70 50 61 67 65 29 2d 3e 61 44 61 74 61   ((pPage)->aData
3850: 20 2b 20 67 65 74 32 62 79 74 65 28 26 28 70 50   + get2byte(&(pP
3860: 61 67 65 29 2d 3e 61 44 61 74 61 5b 28 70 50 61  age)->aData[(pPa
3870: 67 65 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  ge)->cellOffset+
3880: 32 2a 28 69 43 65 6c 6c 29 5d 29 29 0a 23 69 66  2*(iCell)])).#if
3890: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
38a0: 75 38 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  u8 *sqlite3Btree
38b0: 46 69 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65  FindCell(MemPage
38c0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
38d0: 6c 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ll){.  assert( i
38e0: 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73  Cell>=0 );.  ass
38f0: 65 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62  ert( iCell<get2b
3900: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
3910: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
3920: 65 74 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75  et+3]) );.  retu
3930: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
3940: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e  e, iCell);.}.#en
3950: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3960: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
3970: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
3980: 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 29  3BtreeFindCell()
3990: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
39a0: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
39b0: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
39c0: 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e  w cells.  See in
39d0: 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75  sert.*/.static u
39e0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
39f0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
3a00: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
3a10: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
3a20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3a30: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
3a40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3a50: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
3a60: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
3a70: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
3a80: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
3a90: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
3aa0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
3ab0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
3ac0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
3ad0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
3ae0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
3af0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
3b00: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
3b10: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
3b20: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
3b30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
3b40: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
3b50: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
3b60: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
3b70: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
3b80: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
3b90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
3ba0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
3bb0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
3bc0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c  s function.  sql
3bd0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3be0: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
3bf0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
3c00: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
3c10: 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  nt and sqlite3Bt
3c20: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3c30: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
3c40: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
3c50: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
3c60: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
3c70: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
3c80: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
3c90: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
3ca0: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
3cb0: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
3cc0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
3cd0: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
3ce0: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
3cf0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
3d00: 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  aster..*/.void s
3d10: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3d20: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
3d30: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
3d40: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
3d50: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
3d60: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3d80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
3d90: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
3da0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
3db0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
3dc0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3dd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20  */.){.  int n;  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
3e00: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
3e10: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
3e20: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
3e30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3e40: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
3e50: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
3e60: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3e70: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
3e80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
3e90: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
3ea0: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
3eb0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
3ec0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
3ed0: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
3ee0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
3ef0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
3f00: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
3f10: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
3f20: 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Data ){.    n +=
3f30: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
3f40: 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64  ell[n], nPayload
3f50: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3f60: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
3f70: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61  }.  pInfo->nData
3f80: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69   = nPayload;.  i
3f90: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
3fa0: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
3fb0: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
3fc0: 2c 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d  , (u64 *)&pInfo-
3fd0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
3fe0: 0a 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20  .    u32 x;.    
3ff0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
4000: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 78 29 3b 0a  (&pCell[n], x);.
4010: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
4020: 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  = x;.    nPayloa
4030: 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49  d += x;.  }.  pI
4040: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
4050: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
4060: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
4070: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
4080: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
4090: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
40a0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
40b0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
40c0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
40d0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
40e0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
40f0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
4100: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
4110: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b  /.    int nSize;
4120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
4130: 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20  al size of cell 
4140: 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73  content in bytes
4150: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
4160: 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64  Local = nPayload
4170: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
4180: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
4190: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
41a0: 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53   + n;.    if( nS
41b0: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e  ize<4 ){.      n
41c0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
41d0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
41e0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
41f0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
4200: 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20  Size = nSize;.  
4210: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4220: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
4230: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
4240: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
4250: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
4260: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
4270: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
4280: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
4290: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
42a0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
42b0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
42c0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
42d0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
42e0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
42f0: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
4300: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
4310: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
4320: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
4330: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
4340: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
4350: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
4360: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
4370: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
4380: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
4390: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
43a0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
43b0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
43c0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
43d0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
43e0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
43f0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
4400: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
4410: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4420: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4430: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
4440: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
4450: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4460: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4470: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
4480: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
4490: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
44a0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
44b0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
44c0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
44d0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
44e0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
44f0: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
4500: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
4510: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
4520: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
4530: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
4540: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
4550: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
4560: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
4570: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
4580: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4590: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
45a0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
45b0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
45c0: 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e  erflow = pInfo->
45d0: 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20  nLocal + n;.    
45e0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
45f0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4600: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
4610: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
4620: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
4630: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
4640: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
4650: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
4660: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
4670: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
4680: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
4690: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
46a0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
46b0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
46c0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
46d0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
46f0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
4700: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
4710: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
4720: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
4730: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
4740: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
4750: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4760: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
4770: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
4780: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
4790: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
47a0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
47b0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
47c0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
47d0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
47e0: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
47f0: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
4800: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
4810: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
4820: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
4830: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
4840: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
4850: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
4860: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
4870: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
4880: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
4890: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
48a0: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
48b0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
48c0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
48d0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
48e0: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
48f0: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
4900: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 75 31 36  endif.static u16
4910: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
4920: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
4930: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
4940: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4950: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4960: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4970: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
4980: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
4990: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
49a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
49b0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
49c0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
49d0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
49e0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
49f0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4a00: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4a10: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4a20: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4a30: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4a40: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4a50: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4a60: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
4a70: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
4a80: 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29  ){.  if( pCell )
4a90: 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
4aa0: 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nfo;.    sqlite3
4ab0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
4ac0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
4ad0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
4ae0: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
4af0: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4b00: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
4b10: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
4b20: 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
4b30: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
4b40: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
4b50: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
4b60: 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
4b70: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
4b80: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
4b90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4ba0: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
4bb0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
4bc0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
4bd0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
4be0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
4bf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
4c00: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69  * If the cell wi
4c10: 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f  th index iCell o
4c20: 6e 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  n page pPage con
4c30: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
4c40: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
4c50: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
4c60: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
4c70: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
4c80: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
4c90: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
4ca0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
4cb0: 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  fl(MemPage *pPag
4cc0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
4cd0: 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73   u8 *pCell;.  as
4ce0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4cf0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
4d00: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
4d10: 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65   pCell = findOve
4d20: 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
4d30: 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72   iCell);.  retur
4d40: 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
4d50: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
4d60: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
4d70: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
4d80: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
4d90: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
4da0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
4db0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
4dc0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
4dd0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
4de0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
4df0: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
4e00: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
4e10: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
4e20: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
4e30: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
4e40: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
4e50: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
4e60: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
4e70: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
4e80: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
4e90: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
4ea0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
4eb0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
4ec0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
4ed0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
4ee0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
4f10: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63  rst byte after c
4f20: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
4f30: 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  y */.  int hdr; 
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
4f60: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
4f70: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4f90: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
4fa0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
4fb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4fc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
4fd0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
4fe0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
4ff0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
5000: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
5010: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
5020: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
5030: 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20  t brk;          
5040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
5050: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
5060: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
5070: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
5080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5090: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
50a0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
50b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
50c0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
50d0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
50e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
50f0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
5100: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
5110: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  l content */..  
5120: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5130: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5140: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
5160: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5170: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
5180: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
5190: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
51a0: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
51b0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
51c0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
51d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
51e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
51f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5200: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
5210: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
5220: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
5230: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
5240: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
5250: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
5260: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
5270: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
5280: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
5290: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
52a0: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
52b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
52c0: 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  +3]) );.  usable
52d0: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
52e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
52f0: 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28   brk = get2byte(
5300: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
5310: 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72   memcpy(&temp[br
5320: 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20  k], &data[brk], 
5330: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b  usableSize - brk
5340: 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c  );.  brk = usabl
5350: 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30  eSize;.  for(i=0
5360: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
5370: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
5380: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
5390: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
53a0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
53b0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
53c0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
53d0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
53e0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3c 70 50     assert( pc<pP
53f0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5400: 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65  Size );.    size
5410: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
5420: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
5430: 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a  ;.    brk -= siz
5440: 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  e;.    memcpy(&d
5450: 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b  ata[brk], &temp[
5460: 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  pc], size);.    
5470: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
5480: 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  brk);.  }.  asse
5490: 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66  rt( brk>=cellOff
54a0: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20  set+2*nCell );. 
54b0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
54c0: 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20  hdr+5], brk);.  
54d0: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
54e0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
54f0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
5500: 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20  ] = 0;.  addr = 
5510: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
5520: 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  ll;.  memset(&da
5530: 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b  ta[addr], 0, brk
5540: 2d 61 64 64 72 29 3b 0a 20 20 72 65 74 75 72 6e  -addr);.  return
5550: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5560: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
5570: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
5580: 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a  ce on a page..**
5590: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
55a0: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
55b0: 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20  >aData[] of the 
55c0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a  first byte of.**
55d0: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
55e0: 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20 30  ion. Or return 0
55f0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   if there is not
5600: 20 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20   enough free.** 
5610: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
5620: 65 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  e to satisfy the
5630: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75   allocation requ
5640: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  est..**.** If th
5650: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  e page contains 
5660: 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73  nBytes of free s
5670: 70 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f  pace but does no
5680: 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79  t contain.** nBy
5690: 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75  tes of contiguou
56a0: 73 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68  s free space, th
56b0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
56c0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a  automatically.**
56d0: 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65   calls defrageme
56e0: 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73  ntPage() to cons
56f0: 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65  olidate all free
5700: 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a   space before .*
5710: 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  * allocating the
5720: 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73   new chunk..*/.s
5730: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
5740: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
5750: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
5760: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
5770: 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73  pc, hdr;.  int s
5780: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67  ize;.  int nFrag
5790: 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69  ;.  int top;.  i
57a0: 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  nt nCell;.  int 
57b0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e  cellOffset;.  un
57c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
57d0: 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70  a;.  .  data = p
57e0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61  Page->aData;.  a
57f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
5800: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
5810: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
5820: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5830: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
5840: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5850: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
5860: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
5870: 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42 79  f( nByte<4 ) nBy
5880: 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70 50  te = 4;.  if( pP
5890: 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65  age->nFree<nByte
58a0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   || pPage->nOver
58b0: 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e 20  flow>0 ) return 
58c0: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  0;.  pPage->nFre
58d0: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64  e -= nByte;.  hd
58e0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
58f0: 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  fset;..  nFrag =
5900: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
5910: 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a  if( nFrag<60 ){.
5920: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
5930: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
5940: 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69  ng for a slot bi
5950: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
5960: 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  sfy the.    ** s
5970: 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f  pace request. */
5980: 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b  .    addr = hdr+
5990: 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  1;.    while( (p
59a0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
59b0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
59c0: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
59d0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
59e0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ]);.      if( si
59f0: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
5a00: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42       if( size<nB
5a10: 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  yte+4 ){.       
5a20: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
5a30: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
5a40: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
5a50: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46  data[hdr+7] = nF
5a60: 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79  rag + size - nBy
5a70: 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  te;.          re
5a80: 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20  turn pc;.       
5a90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5aa0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5ab0: 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79  [pc+2], size-nBy
5ac0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  te);.          r
5ad0: 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20  eturn pc + size 
5ae0: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
5af0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5b00: 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20   addr = pc;.    
5b10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
5b20: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
5b30: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
5b40: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
5b50: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
5b60: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
5b70: 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a  tent area..  */.
5b80: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
5b90: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
5ba0: 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
5bb0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
5bc0: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
5bd0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
5be0: 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  et;.  if( nFrag>
5bf0: 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65  =60 || cellOffse
5c00: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f  t + 2*nCell > to
5c10: 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  p - nByte ){.   
5c20: 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74 50   if( defragmentP
5c30: 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65 74  age(pPage) ) ret
5c40: 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d  urn 0;.    top =
5c50: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5c60: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74  hdr+5]);.  }.  t
5c70: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61  op -= nByte;.  a
5c80: 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65  ssert( cellOffse
5c90: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74  t + 2*nCell <= t
5ca0: 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  op );.  put2byte
5cb0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5cc0: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
5cd0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
5ce0: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
5cf0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
5d00: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
5d10: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
5d20: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
5d30: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
5d40: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
5d50: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
5d60: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
5d70: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
5d80: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
5d90: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
5da0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
5db0: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
5dc0: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
5dd0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
5de0: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
5df0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53  tatic void freeS
5e00: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
5e10: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
5e20: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
5e30: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
5e40: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
5e50: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
5e60: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
5e70: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
5e80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5e90: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5ea0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5eb0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5ec0: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
5ed0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
5ee0: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
5ef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
5f00: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
5f10: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5f20: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
5f30: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5f40: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5f50: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
5f60: 20 73 69 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d   size<4 ) size =
5f70: 20 34 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   4;..#ifdef SQLI
5f80: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
5f90: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
5fa0: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
5fb0: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
5fc0: 68 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44  hen the SECURE_D
5fd0: 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69  ELETE .  ** opti
5fe0: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74  on is enabled at
5ff0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f   compile-time */
6000: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
6010: 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29  start], 0, size)
6020: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
6030: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
6040: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
6050: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
6060: 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20  ocks */.  hdr = 
6070: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6080: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
6090: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
60a0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
60b0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
60c0: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
60d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
60e0: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
60f0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
6100: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
6110: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
6120: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
6130: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
6140: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
6150: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
6160: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 62 65  );.  assert( pbe
6170: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
6180: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
6190: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
61a0: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
61b0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
61c0: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
61d0: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
61e0: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
61f0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73  Page->nFree += s
6200: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65  ize;..  /* Coale
6210: 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65  sce adjacent fre
6220: 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64  e blocks */.  ad
6230: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
6240: 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69  ffset + 1;.  whi
6250: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
6260: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
6270: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
6280: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a  t pnext, psize;.
6290: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
62a0: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
62b0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
62c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
62d0: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
62e0: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
62f0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
6300: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
6310: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
6320: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
6330: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
6340: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
6350: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
6360: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
6370: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
6380: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6390: 66 72 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65  frag<=data[pPage
63a0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29  ->hdrOffset+7] )
63b0: 3b 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61  ;.      data[pPa
63c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
63d0: 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20   -= frag;.      
63e0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
63f0: 62 65 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65  begin], get2byte
6400: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b  (&data[pnext]));
6410: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
6420: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
6430: 20 70 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28   pnext+get2byte(
6440: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d  &data[pnext+2])-
6450: 70 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c  pbegin);.    }el
6460: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
6470: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
6480: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6490: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
64a0: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
64b0: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
64c0: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
64d0: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
64e0: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
64f0: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
6500: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
6510: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
6520: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6530: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
6540: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
6550: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
6560: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
6570: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
6580: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  r+5]);.    put2b
6590: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
65a0: 2c 20 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65  , top + get2byte
65b0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
65c0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
65d0: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
65e0: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
65f0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
6600: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
6610: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
6620: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
6630: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
6640: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
6650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
6660: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
6670: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
6680: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
6690: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
66a0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
66b0: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
66c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
66d0: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
66e0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
66f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6700: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6710: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6720: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
6730: 3e 69 6e 74 4b 65 79 20 3d 20 28 66 6c 61 67 42  >intKey = (flagB
6740: 79 74 65 20 26 20 28 50 54 46 5f 49 4e 54 4b 45  yte & (PTF_INTKE
6750: 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29  Y|PTF_LEAFDATA))
6760: 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65  !=0;.  pPage->ze
6770: 72 6f 44 61 74 61 20 3d 20 28 66 6c 61 67 42 79  roData = (flagBy
6780: 74 65 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54  te & PTF_ZERODAT
6790: 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  A)!=0;.  pPage->
67a0: 6c 65 61 66 20 3d 20 28 66 6c 61 67 42 79 74 65  leaf = (flagByte
67b0: 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b   & PTF_LEAF)!=0;
67c0: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
67d0: 74 72 53 69 7a 65 20 3d 20 34 2a 28 70 50 61 67  trSize = 4*(pPag
67e0: 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b 0a 20 20 70  e->leaf==0);.  p
67f0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
6800: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 20  .  if( flagByte 
6810: 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  & PTF_LEAFDATA )
6820: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61  {.    pPage->lea
6830: 66 44 61 74 61 20 3d 20 31 3b 0a 20 20 20 20 70  fData = 1;.    p
6840: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
6850: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
6860: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
6870: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
6880: 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
6890: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
68a0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
68b0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
68c0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
68d0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
68e0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
68f0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44   }.  pPage->hasD
6900: 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a  ata = !(pPage->z
6910: 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61  eroData || (!pPa
6920: 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67  ge->leaf && pPag
6930: 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 7d  e->leafData));.}
6940: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
6950: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
6960: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
6970: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
6980: 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
6990: 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
69a0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
69b0: 74 68 65 20 4d 65 6d 50 61 67 65 20 77 68 69 63  the MemPage whic
69c0: 68 0a 2a 2a 20 69 73 20 74 68 65 20 70 61 72 65  h.** is the pare
69d0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 62  nt of the page b
69e0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
69f0: 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61  .  The root of a
6a00: 0a 2a 2a 20 42 54 72 65 65 20 68 61 73 20 6e 6f  .** BTree has no
6a10: 20 70 61 72 65 6e 74 20 61 6e 64 20 73 6f 20 66   parent and so f
6a20: 6f 72 20 74 68 61 74 20 70 61 67 65 2c 20 70 50  or that page, pP
6a30: 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a  arent==NULL..**.
6a40: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
6a50: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
6a60: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
6a70: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
6a80: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
6a90: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
6aa0: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
6ab0: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
6ac0: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
6ad0: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
6ae0: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
6af0: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
6b00: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
6b10: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
6b20: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
6b30: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
6b40: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
6b50: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  rruption..*/.int
6b60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
6b70: 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  tPage(.  MemPage
6b80: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
6b90: 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
6ba0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
6bb0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
6bc0: 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ent       /* The
6bd0: 20 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20   parent.  Might 
6be0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6bf0: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
6c00: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
6c10: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
6c20: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
6c30: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  [] */.  int hdr;
6c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6c50: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
6c60: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
6c70: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
6c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
6c90: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
6ca0: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
6cb0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
6cc0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
6cd0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
6ce0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
6cf0: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
6d00: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
6d10: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ch page */.  int
6d20: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
6d30: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
6d40: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
6d50: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
6d60: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
6d70: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
6d80: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
6d90: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
6da0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
6db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
6dc0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
6dd0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
6de0: 2a 2f 0a 20 20 75 38 20 2a 70 4f 66 66 3b 20 20  */.  u8 *pOff;  
6df0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
6e00: 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68 65 63  tor used to chec
6e10: 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65  k all cell offse
6e20: 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67 65 20  ts are in range 
6e30: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
6e40: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
6e50: 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c  er to end of cel
6e60: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 2a  l offset array *
6e70: 2f 0a 20 20 75 38 20 6d 61 73 6b 3b 20 20 20 20  /.  u8 mask;    
6e80: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
6e90: 66 20 62 69 74 73 20 74 68 61 74 20 6d 75 73 74  f bits that must
6ea0: 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20   be zero in MSB 
6eb0: 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  of cell offsets 
6ec0: 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67  */..  pBt = pPag
6ed0: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
6ee0: 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ( pBt!=0 );.  as
6ef0: 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30  sert( pParent==0
6f00: 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74   || pParent->pBt
6f10: 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ==pBt );.  asser
6f20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6f30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6f40: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6f50: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
6f60: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
6f70: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
6f80: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
6f90: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
6fa0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
6fb0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
6fc0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
6fd0: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
6fe0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6ff0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7000: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
7010: 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20  Parent!=pParent 
7020: 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65  && (pPage->pPare
7030: 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  nt!=0 || pPage->
7040: 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f  isInit) ){.    /
7050: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67  * The parent pag
7060: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63  e should never c
7070: 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65  hange unless the
7080: 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
7090: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
70a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
70b0: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  PT;.  }.  if( pP
70c0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65  age->isInit ) re
70d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
70e0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
70f0: 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65  rent==0 && pPare
7100: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  nt!=0 ){.    pPa
7110: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ge->pParent = pP
7120: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
7130: 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
7140: 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
7150: 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  }.  hdr = pPage-
7160: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
7170: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7180: 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  a;.  decodeFlags
7190: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
71a0: 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ]);.  pPage->nOv
71b0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50  erflow = 0;.  pP
71c0: 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
71d0: 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  0;.  usableSize 
71e0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
71f0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  e;.  pPage->cell
7200: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
7210: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
7220: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
7230: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
7240: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
7250: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
7260: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7270: 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70  hdr+3]);.  if( p
7280: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
7290: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
72a0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
72b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
72c0: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
72d0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
72e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
72f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7300: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7310: 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50  ->nCell==0 && pP
7320: 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61 72  arent!=0 && pPar
7330: 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a  ent->pgno!=1 ){.
7340: 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73      /* All pages
7350: 20 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c 65   must have at le
7360: 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78  ast one cell, ex
7370: 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70 61  cept for root pa
7380: 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ges */.    retur
7390: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
73a0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
73b0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
73c0: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
73d0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70   the page */.  p
73e0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
73f0: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46  ta[hdr+1]);.  nF
7400: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
7410: 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f  ] + top - (cellO
7420: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
7430: 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65  >nCell);.  while
7440: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e  ( pc>0 ){.    in
7450: 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  t next, size;.  
7460: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
7470: 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f  ize-4 ){.      /
7480: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  * Free block is 
7490: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
74a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
74b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
74c0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78  ; .    }.    nex
74d0: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
74e0: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a  ta[pc]);.    siz
74f0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
7500: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
7510: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
7520: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
7530: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
7540: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
7550: 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
7560: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
7570: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7580: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
7590: 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20  nFree += size;. 
75a0: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
75b0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
75c0: 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28 20   = nFree;.  if( 
75d0: 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a  nFree>=usableSiz
75e0: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65  e ){.    /* Free
75f0: 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78   space cannot ex
7600: 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20  ceed total page 
7610: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  size */.    retu
7620: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7630: 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20  T_BKPT; .  }..  
7640: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c  /* Check that al
7650: 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20 69 6e  l the offsets in
7660: 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74   the cell offset
7670: 20 61 72 72 61 79 20 61 72 65 20 77 69 74 68 69   array are withi
7680: 6e 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 6d 61  n range. */.  ma
7690: 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42 74  sk = ~(((u8)(pBt
76a0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29 2d  ->pageSize>>8))-
76b0: 31 29 3b 0a 20 20 70 45 6e 64 20 3d 20 26 64 61  1);.  pEnd = &da
76c0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
76d0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b  pPage->nCell*2];
76e0: 0a 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74  .  for(pOff=&dat
76f0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70  a[cellOffset]; p
7700: 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28  Off!=pEnd && !((
7710: 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f  *pOff)&mask); pO
7720: 66 66 2b 3d 32 29 3b 0a 20 20 69 66 28 20 70 4f  ff+=2);.  if( pO
7730: 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  ff!=pEnd ){.    
7740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7750: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
7760: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
7770: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
7780: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7790: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
77a0: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
77b0: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
77c0: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
77d0: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
77e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
77f0: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
7800: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
7810: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
7820: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
7830: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
7840: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
7850: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
7860: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
7870: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69  Offset;.  int fi
7880: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
7890: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
78a0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
78b0: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
78c0: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
78d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
78e0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
78f0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
7900: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
7910: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
7920: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
7930: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
7940: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7950: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
7960: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
7970: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7980: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7990: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
79a0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
79b0: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
79c0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
79d0: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  );.  data[hdr] =
79e0: 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20   flags;.  first 
79f0: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
7a00: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
7a10: 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  =0);.  memset(&d
7a20: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
7a30: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
7a40: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
7a50: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
7a60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
7a70: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
7a80: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
7a90: 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63  e - first;.  dec
7aa0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
7ab0: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
7ac0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
7ad0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
7ae0: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
7af0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
7b00: 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  w = 0;.  pPage->
7b10: 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
7b20: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
7b30: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
7b40: 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
7b50: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
7b60: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
7b70: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
7b80: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
7b90: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
7ba0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
7bb0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
7bc0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
7bd0: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
7be0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
7bf0: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
7c00: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
7c10: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
7c20: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
7c30: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
7c40: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
7c50: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
7c60: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
7c70: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
7c80: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
7c90: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
7ca0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
7cb0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
7cc0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
7cd0: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
7ce0: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
7cf0: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
7d00: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
7d10: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
7d20: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  that point..*/.i
7d30: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
7d40: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
7d50: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
7d60: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
7d70: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
7d80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d90: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
7da0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
7db0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
7dc0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
7dd0: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
7de0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
7df0: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
7e00: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
7e10: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
7e20: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
7e30: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
7e40: 67 65 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  ge;.  DbPage *pD
7e50: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
7e60: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7e70: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7e80: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
7e90: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
7ea0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
7eb0: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
7ec0: 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
7ed0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7ee0: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20  urn rc;.  pPage 
7ef0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
7f00: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
7f10: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
7f20: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
7f30: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7f40: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
7f50: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
7f60: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
7f70: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
7f80: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
7f90: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
7fa0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
7fb0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
7fc0: 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
7fd0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
7fe0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7ff0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
8000: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
8010: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
8020: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
8030: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
8040: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
8050: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
8060: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
8070: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
8080: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
8090: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
80a0: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
80b0: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
80c0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
80d0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
80e0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
80f0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
8100: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
8110: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
8120: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
8130: 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
8140: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
8150: 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50  r here */.  MemP
8160: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
8170: 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68   /* Parent of th
8180: 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  e page */.){.  i
8190: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
81a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
81b0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
81c0: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
81d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
81e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
81f0: 50 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20  PT; .  }.  rc = 
8200: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
8210: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
8220: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
8230: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
8240: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
8250: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nit==0 ){.    rc
8260: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
8270: 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c  nitPage(*ppPage,
8280: 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69   pParent);.    i
8290: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
82a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
82b0: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
82c0: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
82d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
82e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
82f0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
8300: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
8310: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
8320: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
8330: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
8340: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e  te3BtreeGetPage.
8350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8360: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
8370: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
8380: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
8390: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
83a0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
83b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
83c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
83d0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
83e0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
83f0: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
8400: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
8410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
8420: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
8430: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
8440: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
8450: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8460: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8470: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
8480: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8490: 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
84a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
84b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
84c0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
84d0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
84e0: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 72 65  for a page.** re
84f0: 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 57 65 20  aches zero.  We 
8500: 6e 65 65 64 20 74 6f 20 75 6e 72 65 66 20 74 68  need to unref th
8510: 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e pParent pointe
8520: 72 20 77 68 65 6e 20 74 68 61 74 0a 2a 2a 20 68  r when that.** h
8530: 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  appens..*/.stati
8540: 63 20 76 6f 69 64 20 70 61 67 65 44 65 73 74 72  c void pageDestr
8550: 75 63 74 6f 72 28 44 62 50 61 67 65 20 2a 70 44  uctor(DbPage *pD
8560: 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ata, int pageSiz
8570: 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
8580: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
8590: 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
85a0: 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  0 );.  pPage = (
85b0: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
85c0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
85d0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
85e0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
85f0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
8600: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8610: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8620: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
8630: 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  nt ){.    MemPag
8640: 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e *pParent = pPa
8650: 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ge->pParent;.   
8660: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
8670: 2d 3e 70 42 74 3d 3d 70 50 61 67 65 2d 3e 70 42  ->pBt==pPage->pB
8680: 74 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  t );.    pPage->
8690: 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20  pParent = 0;.   
86a0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
86b0: 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61  rent);.  }.  pPa
86c0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
86d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
86e0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
86f0: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
8700: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
8710: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
8720: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
8730: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
8740: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
8750: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
8760: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
8770: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
8780: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
8790: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
87a0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
87b0: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
87c0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
87d0: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
87e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
87f0: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
8800: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
8810: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
8820: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
8830: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
8840: 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ata, int pageSiz
8850: 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
8860: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
8870: 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
8880: 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  0 );.  pPage = (
8890: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
88a0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
88b0: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61  Data);.  if( pPa
88c0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
88d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
88e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
88f0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8900: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
8910: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  Init = 0;.    sq
8920: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
8930: 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
8940: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d  >pParent);.  }.}
8950: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
8960: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
8970: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
8980: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
8990: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
89a0: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
89b0: 41 72 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 42  Arg, int n){.  B
89c0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
89d0: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
89e0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
89f0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
8a00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8a10: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
8a20: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
8a30: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
8a40: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
8a50: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
8a60: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
8a70: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
8a80: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
8a90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
8aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
8ab0: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
8ac0: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
8ad0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
8ae0: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
8af0: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
8b00: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
8b10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
8b20: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
8b30: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
8b40: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
8b50: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
8b60: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
8b70: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
8b80: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
8b90: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
8ba0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
8bb0: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
8bc0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
8bd0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
8be0: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
8bf0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
8c00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
8c10: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
8c20: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
8c30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8c40: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
8c50: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
8c60: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
8c70: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
8c80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
8c90: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
8ca0: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
8cb0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
8cc0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
8cd0: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
8ce0: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
8cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
8d00: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
8d10: 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
8d20: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
8d30: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
8d40: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
8d50: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
8d60: 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
8d70: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
8d80: 3b 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64  ;      /* Shared
8d90: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
8da0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
8db0: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
8dc0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
8dd0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
8de0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8df0: 4b 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76  K;.  int nReserv
8e00: 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
8e10: 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
8e20: 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  ];..  /* Set the
8e30: 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
8e40: 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
8e50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
8e60: 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
8e70: 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
8e80: 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20 54  ased database. T
8e90: 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e  his symbol is on
8ea0: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a 20  ly required if. 
8eb0: 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68   ** either of th
8ec0: 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72  e shared-data or
8ed0: 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74   autovacuum feat
8ee0: 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65  ures are compile
8ef0: 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  d .  ** into the
8f00: 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23   library..  */.#
8f10: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8f20: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
8f30: 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65  ACHE) || !define
8f40: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
8f50: 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64  TOVACUUM).  #ifd
8f60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
8f70: 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73  EMORYDB.    cons
8f80: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
8f90: 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63  0;.  #else.    c
8fa0: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
8fb0: 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20   = zFilename && 
8fc0: 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d  !strcmp(zFilenam
8fd0: 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a  e, ":memory:");.
8fe0: 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a    #endif.#endif.
8ff0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
9000: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9010: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9020: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
9030: 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66    pVfs = db->pVf
9040: 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  s;.  p = sqlite3
9050: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
9060: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
9070: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
9080: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9090: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
90a0: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
90b0: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69   p->db = db;..#i
90c0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
90d0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
90e0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
90f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
9100: 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
9110: 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
9120: 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
9130: 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
9140: 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
9150: 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
9160: 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
9170: 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
9180: 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 66 6c  h.  */.  if( (fl
9190: 61 67 73 20 26 20 42 54 52 45 45 5f 50 52 49 56  ags & BTREE_PRIV
91a0: 41 54 45 29 3d 3d 30 0a 20 20 20 26 26 20 69 73  ATE)==0.   && is
91b0: 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26 26 20 28  Memdb==0.   && (
91c0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
91d0: 54 45 5f 56 74 61 62 29 3d 3d 30 0a 20 20 20 26  TE_Vtab)==0.   &
91e0: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  & zFilename && z
91f0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b  Filename[0].  ){
9200: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9210: 53 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  SharedCacheEnabl
9220: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
9230: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
9240: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
9250: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
9260: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
9270: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
9280: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
9290: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
92a0: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
92b0: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
92c0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  e = 1;.      if(
92d0: 20 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 64   db ){.        d
92e0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
92f0: 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a  TE_SharedCache;.
9300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9310: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
9320: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9330: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
9340: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9350: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
9360: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
9370: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
9380: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
9390: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
93a0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
93b0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
93c0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
93d0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
93e0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
93f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9400: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
9410: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
9420: 6f 72 28 70 42 74 3d 73 71 6c 69 74 65 33 53 68  or(pBt=sqlite3Sh
9430: 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b 20 70  aredCacheList; p
9440: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
9450: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
9460: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
9470: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9480: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
9490: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
94a0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
94b0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
94d0: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
94e0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
94f0: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
9500: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
9510: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
9520: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
9530: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9550: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9560: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
9570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9580: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
9590: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
95a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
95b0: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
95c0: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
95d0: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
95e0: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
95f0: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
9600: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
9610: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
9620: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
9630: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
9640: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
9650: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
9660: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
9670: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9680: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
9690: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
96a0: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
96b0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
96c0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
96d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
96e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
96f0: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
9700: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
9710: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
9720: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
9730: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
9740: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
9750: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
9760: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
9770: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
9780: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
9790: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
97a0: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
97b0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
97c0: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
97d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
97e0: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
97f0: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
9800: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9810: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
9820: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
9830: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9840: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
9850: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9860: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
9870: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9880: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
9890: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
98a0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
98b0: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
98c0: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
98d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
98e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
98f0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
9900: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
9910: 2d 3e 62 75 73 79 48 64 72 2e 78 46 75 6e 63 20  ->busyHdr.xFunc 
9920: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
9930: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 3b  vokeBusyHandler;
9940: 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64  .    pBt->busyHd
9950: 72 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a 20 20  r.pArg = pBt;.  
9960: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
9970: 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
9980: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
9990: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
99c0: 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20  gs, vfsFlags);. 
99d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
99e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
99f0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
9a00: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
9a10: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
9a20: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
9a30: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
9a40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9a50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
9a60: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
9a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9a80: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
9a90: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
9aa0: 65 72 2c 20 26 70 42 74 2d 3e 62 75 73 79 48 64  er, &pBt->busyHd
9ab0: 72 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  r);.    p->pBt =
9ac0: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c   pBt;.  .    sql
9ad0: 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74  ite3PagerSetDest
9ae0: 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67  ructor(pBt->pPag
9af0: 65 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74  er, pageDestruct
9b00: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
9b10: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
9b20: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
9b30: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70  geReinit);.    p
9b40: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
9b50: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
9b60: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72   = 0;.    pBt->r
9b70: 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65  eadOnly = sqlite
9b80: 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
9b90: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
9ba0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
9bb0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62   = get2byte(&zDb
9bc0: 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20  Header[16]);.   
9bd0: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
9be0: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
9bf0: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
9c00: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
9c10: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
9c20: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
9c30: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
9c40: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
9c50: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
9c60: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
9c70: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
9c80: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
9c90: 69 7a 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ize);.#ifndef SQ
9ca0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9cb0: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
9cc0: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
9cd0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
9ce0: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
9cf0: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
9d00: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
9d10: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
9d20: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
9d30: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
9d40: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
9d50: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
9d60: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
9d70: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
9d80: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
9d90: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
9da0: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
9db0: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
9dc0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
9dd0: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
9de0: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
9df0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
9e00: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
9e10: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
9e20: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
9e30: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
9e40: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
9e50: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
9e60: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
9e70: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
9e80: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
9e90: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
9ea0: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
9eb0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
9ec0: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
9ed0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
9ee0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
9ef0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
9f00: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
9f10: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
9f20: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
9f30: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
9f40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9f50: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
9f60: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
9f70: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
9f80: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
9f90: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
9fa0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
9fb0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
9fc0: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
9fd0: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
9fe0: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75      }.    pBt->u
9ff0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
a000: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
a010: 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
a020: 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
a030: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
a040: 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
a050: 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
a060: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
a070: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
a080: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
a090: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69  ageSize);.   .#i
a0a0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a0b0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
a0c0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
a0d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
a0e0: 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
a0f0: 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
a100: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
a110: 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
a120: 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
a130: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
a140: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
a150: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
a160: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
a170: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
a180: 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53   1;.      mutexS
a190: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
a1a0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
a1b0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
a1c0: 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28  STER);.      if(
a1d0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
a1e0: 46 45 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6e  FE && sqlite3Con
a1f0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
a200: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
a210: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
a220: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
a230: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
a240: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
a250: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
a260: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a270: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
a280: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a290: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
a2a0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
a2b0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a2d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a2e0: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
a2f0: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
a300: 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64   = sqlite3Shared
a310: 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20  CacheList;.     
a320: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
a330: 63 68 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20  cheList = pBt;. 
a340: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
a350: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
a360: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
a370: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
a380: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a390: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
a3a0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a3b0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
a3c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
a3d0: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
a3e0: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
a3f0: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
a400: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
a410: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
a420: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
a430: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
a440: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
a450: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
a460: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
a470: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
a480: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
a490: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
a4a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
a4b0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
a4c0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
a4d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
a4e0: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
a4f0: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
a500: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
a510: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
a520: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
a530: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
a540: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
a550: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
a560: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
a570: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
a580: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
a590: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
a5a0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
a5b0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
a5c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
a5d0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
a5e0: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
a5f0: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
a600: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
a610: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
a620: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a630: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
a640: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
a650: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
a660: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
a670: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
a680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
a690: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
a6a0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
a6b0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
a6c0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
a6d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
a6e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
a6f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
a700: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
a710: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
a720: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a730: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
a740: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
a750: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
a760: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
a770: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
a780: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a790: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
a7a0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
a7b0: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
a7c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a7d0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
a7e0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
a7f0: 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
a800: 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
a810: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
a820: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
a830: 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
a840: 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
a850: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
a860: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
a870: 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
a880: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
a890: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
a8a0: 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
a8b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
a8c0: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
a8d0: 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
a8e0: 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
a8f0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
a900: 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f  CACHE.  sqlite3_
a910: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a  mutex *pMaster;.
a920: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
a930: 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
a940: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
a950: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
a960: 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
a970: 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20  x) );.  pMaster 
a980: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
a990: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a9a0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
a9b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a9c0: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
a9d0: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
a9e0: 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
a9f0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
aa00: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
aa10: 4c 69 73 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  List==pBt ){.   
aa20: 20 20 20 73 71 6c 69 74 65 33 53 68 61 72 65 64     sqlite3Shared
aa30: 43 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74 2d  CacheList = pBt-
aa40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
aa50: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
aa60: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
aa70: 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 77  cheList;.      w
aa80: 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 70  hile( pList && p
aa90: 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
aaa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
aab0: 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
aac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
aad0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
aae0: 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
aaf0: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
ab00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ab10: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
ab20: 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
ab30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
ab40: 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
ab50: 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
ab60: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
ab70: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ab80: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
ab90: 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
aba0: 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
abb0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
abc0: 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
abd0: 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
abe0: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
abf0: 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
ac00: 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a  ZE(pBt) bytes..*
ac10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
ac20: 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
ac30: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ac40: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
ac50: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
ac60: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
ac70: 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
ac80: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
ac90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
aca0: 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
acb0: 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
acc0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
acd0: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
ace0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
acf0: 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
ad00: 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
ad10: 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  );.  pBt->pTmpSp
ad20: 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ace = 0;.}../*.*
ad30: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
ad40: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
ad50: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
ad60: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
ad70: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
ad80: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
ad90: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ada0: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
adb0: 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
adc0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
add0: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
ade0: 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
adf0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ae00: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
ae10: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
ae20: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
ae30: 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
ae40: 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
ae50: 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
ae60: 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
ae70: 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
ae80: 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
ae90: 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
aea0: 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
aeb0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
aec0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
aed0: 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
aee0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
aef0: 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
af00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
af10: 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
af20: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
af30: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
af40: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
af50: 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
af60: 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
af70: 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
af80: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
af90: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
afa0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
afb0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
afc0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
afd0: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
afe0: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
aff0: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
b000: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
b010: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
b020: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
b030: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
b040: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
b050: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
b060: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
b070: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
b080: 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
b090: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
b0a0: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
b0b0: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
b0c0: 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
b0d0: 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
b0e0: 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
b0f0: 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
b100: 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
b110: 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
b120: 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
b130: 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
b140: 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
b150: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
b160: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
b170: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
b180: 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
b190: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
b1a0: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
b1b0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
b1c0: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
b1d0: 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
b1e0: 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
b1f0: 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
b200: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
b210: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b220: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
b230: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
b240: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
b250: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
b260: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
b270: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
b280: 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
b290: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
b2a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
b2b0: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
b2c0: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
b2d0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
b2e0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
b2f0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
b300: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
b310: 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
b320: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b330: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
b340: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b350: 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
b360: 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
b370: 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
b380: 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
b390: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
b3a0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
b3b0: 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
b3c0: 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
b3d0: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
b3e0: 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
b3f0: 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
b400: 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
b410: 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
b420: 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
b430: 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
b440: 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
b450: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
b460: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
b470: 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
b480: 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
b490: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
b4a0: 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
b4b0: 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
b4c0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
b4d0: 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
b4e0: 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
b4f0: 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
b500: 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
b510: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
b520: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
b530: 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
b540: 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
b550: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
b560: 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
b570: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
b580: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
b590: 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
b5a0: 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
b5b0: 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
b5c0: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
b5d0: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
b5e0: 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
b5f0: 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
b600: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b610: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
b620: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
b630: 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
b640: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b650: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b660: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b670: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
b680: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
b690: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
b6a0: 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
b6b0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
b6c0: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
b6d0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
b6e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b6f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
b700: 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
b710: 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
b720: 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
b730: 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
b740: 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
b750: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
b760: 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
b770: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
b780: 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
b790: 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
b7a0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
b7b0: 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
b7c0: 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
b7d0: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
b7e0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
b7f0: 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
b800: 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
b810: 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
b820: 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
b830: 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
b840: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
b850: 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
b860: 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
b870: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
b880: 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
b890: 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
b8a0: 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
b8b0: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
b8c0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
b8d0: 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
b8e0: 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74  te3BtreeSetSafet
b8f0: 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c  yLevel(Btree *p,
b900: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
b910: 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53  fullSync){.  BtS
b920: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
b930: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
b940: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b950: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
b960: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
b970: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
b980: 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
b990: 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61  tyLevel(pBt->pPa
b9a0: 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c  ger, level, full
b9b0: 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
b9c0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
b9d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b9e0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
b9f0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
ba00: 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
ba10: 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
ba20: 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
ba30: 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
ba40: 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
ba50: 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
ba60: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
ba70: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ba80: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
ba90: 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
baa0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
bab0: 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
bac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bad0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bae0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
baf0: 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
bb00: 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
bb10: 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
bb20: 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
bb30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
bb40: 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
bb50: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
bb60: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
bb70: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64  rn rc;.}..#if !d
bb80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bb90: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
bba0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
bbb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
bbc0: 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  )./*.** Change t
bbd0: 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
bbe0: 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
bbf0: 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
bc00: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
bc10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
bc20: 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
bc30: 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
bc40: 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
bc50: 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
bc60: 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
bc70: 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
bc80: 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
bc90: 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
bca0: 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
bcb0: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
bcc0: 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
bcd0: 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
bce0: 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
bcf0: 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
bd00: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
bd10: 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
bd20: 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
bd30: 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
bd40: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
bd50: 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
bd60: 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
bd70: 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
bd80: 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
bd90: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
bda0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
bdb0: 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
bdc0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
bdd0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
bde0: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
bdf0: 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
be00: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
be10: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
be20: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
be30: 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
be40: 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
be50: 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
be60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
be70: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
be80: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
be90: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
bea0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
beb0: 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20  eSizeFixed ){.  
bec0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
bed0: 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
bee0: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
bef0: 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
bf00: 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
bf10: 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
bf20: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
bf30: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
bf40: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
bf50: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
bf60: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
bf70: 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
bf80: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
bf90: 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
bfa0: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
bfb0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
bfc0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
bfd0: 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
bfe0: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
bff0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
c000: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66   pageSize;.    f
c010: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
c020: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
c030: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
c040: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
c050: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
c060: 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61  ;.  }.  pBt->usa
c070: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
c080: 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
c090: 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ve;.  sqlite3Btr
c0a0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c0b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c0c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
c0d0: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
c0e0: 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
c0f0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
c100: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
c110: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
c120: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
c130: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c140: 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
c150: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
c160: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c170: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
c180: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c190: 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
c1a0: 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
c1b0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c1c0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
c1d0: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
c1e0: 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
c1f0: 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
c200: 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
c210: 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
c220: 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
c230: 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
c240: 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
c250: 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
c260: 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
c270: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
c280: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
c290: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
c2a0: 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
c2b0: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
c2c0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
c2d0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
c2e0: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
c2f0: 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
c300: 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
c310: 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
c320: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c330: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c340: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
c350: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
c360: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
c370: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c380: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
c390: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
c3a0: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
c3b0: 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
c3c0: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
c3d0: 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
c3e0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
c3f0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
c400: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
c410: 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
c420: 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
c430: 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
c440: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
c450: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
c460: 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
c470: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
c480: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
c490: 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
c4a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c4b0: 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
c4c0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
c4d0: 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
c4e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c4f0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
c500: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
c510: 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
c520: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
c530: 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
c540: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
c550: 61 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d  av = (autoVacuum
c560: 3f 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ?1:0);..  sqlite
c570: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c580: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
c590: 69 7a 65 46 69 78 65 64 20 26 26 20 61 76 21 3d  izeFixed && av!=
c5a0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
c5b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
c5c0: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
c5d0: 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
c5e0: 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a  utoVacuum = av;.
c5f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
c600: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c610: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
c620: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c630: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
c640: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
c650: 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
c660: 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
c670: 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
c680: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
c690: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
c6a0: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
c6b0: 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
c6c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
c6d0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
c6e0: 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
c6f0: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
c700: 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
c710: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c720: 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
c730: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
c740: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
c750: 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
c760: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
c770: 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
c780: 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
c790: 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
c7a0: 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
c7b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c7c0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c7d0: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
c7e0: 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
c7f0: 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
c800: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
c810: 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
c820: 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
c830: 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
c840: 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
c850: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c860: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
c870: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
c880: 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
c890: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
c8a0: 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
c8b0: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
c8c0: 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
c8d0: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
c8e0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
c8f0: 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
c900: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
c910: 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
c920: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
c930: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
c940: 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
c950: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
c960: 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
c970: 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50  pPage1;.  int nP
c980: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
c990: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c9a0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
c9b0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61  ;.  if( pBt->pPa
c9c0: 67 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ge1 ) return SQL
c9d0: 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73  ITE_OK;.  rc = s
c9e0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
c9f0: 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
ca00: 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
ca10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
ca20: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
ca30: 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
ca40: 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
ca50: 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
ca60: 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
ca70: 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
ca80: 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
ca90: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
caa0: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
cab0: 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
cac0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
cad0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
cae0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
caf0: 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ed;.  }else if( 
cb00: 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69  nPage>0 ){.    i
cb10: 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  nt pageSize;.   
cb20: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
cb30: 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
cb40: 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
cb50: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cb60: 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20  NOTADB;.    if( 
cb70: 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
cb80: 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
cb90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
cba0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
cbb0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
cbc0: 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
cbd0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64  .      pBt->read
cbe0: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Only = 1;.    }.
cbf0: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
cc00: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
cc10: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
cc20: 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
cc30: 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
cc40: 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
cc50: 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
cc60: 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
cc70: 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
cc80: 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
cc90: 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
cca0: 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
ccb0: 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
ccc0: 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
ccd0: 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
cce0: 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
ccf0: 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
cd00: 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
cd10: 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
cd20: 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
cd30: 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
cd40: 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
cd50: 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
cd60: 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
cd70: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
cd80: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
cd90: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
cda0: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
cdb0: 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20  (&page1[16]);.  
cdc0: 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
cdd0: 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
cde0: 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32   || pageSize<512
cdf0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c   ||.        (SQL
ce00: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ce10: 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53  E<32768 && pageS
ce20: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
ce30: 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b  AGE_SIZE).    ){
ce40: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
ce50: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
ce60: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
ce70: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
ce80: 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65  =0 );.    usable
ce90: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
cea0: 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
ceb0: 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70   if( pageSize!=p
cec0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
ced0: 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
cee0: 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
cef0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
cf00: 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
cf10: 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
cf20: 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
cf30: 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
cf40: 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
cf50: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
cf60: 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
cf70: 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
cf80: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
cf90: 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
cfa0: 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
cfb0: 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
cfc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
cfd0: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
cfe0: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
cff0: 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
d000: 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
d010: 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
d020: 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
d030: 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
d040: 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
d050: 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
d060: 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
d070: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
d080: 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
d090: 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
d0a0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
d0b0: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
d0c0: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
d0d0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  geSize);.      r
d0e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
d100: 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b  sableSize<500 ){
d110: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
d120: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
d130: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
d140: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
d150: 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
d160: 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
d170: 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
d180: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d190: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
d1a0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
d1b0: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
d1c0: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
d1d0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
d1e0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
d1f0: 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
d200: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
d210: 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
d220: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
d230: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
d240: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
d250: 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
d260: 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
d270: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
d280: 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
d290: 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
d2a0: 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
d2b0: 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
d2c0: 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
d2d0: 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
d2e0: 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
d2f0: 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
d300: 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
d310: 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
d320: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
d330: 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
d340: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
d350: 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
d360: 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
d370: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
d380: 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
d390: 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
d3a0: 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
d3b0: 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
d3c0: 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
d3d0: 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
d3e0: 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
d3f0: 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
d400: 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
d410: 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
d420: 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
d430: 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
d440: 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
d450: 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
d460: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
d470: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
d480: 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b  12)*64/255 - 23;
d490: 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
d4a0: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
d4b0: 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
d4c0: 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c   23;.  pBt->maxL
d4d0: 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eaf = pBt->usabl
d4e0: 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42  eSize - 35;.  pB
d4f0: 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42  t->minLeaf = (pB
d500: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
d510: 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20  )*32/255 - 23;. 
d520: 20 69 66 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63   if( pBt->minLoc
d530: 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  al>pBt->maxLocal
d540: 20 7c 7c 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61   || pBt->maxLoca
d550: 6c 3c 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  l<0 ){.    goto 
d560: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
d570: 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
d580: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
d590: 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
d5a0: 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
d5b0: 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
d5c0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
d5d0: 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e  TE_OK;..page1_in
d5e0: 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c  it_failed:.  rel
d5f0: 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
d600: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
d610: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
d620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d630: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
d640: 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65  ke lockBtree() e
d650: 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61 6c  xcept that it al
d660: 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a  so invokes the.*
d670: 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  * busy callback 
d680: 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b  if there is lock
d690: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a   contention..*/.
d6a0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
d6b0: 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42 74  treeWithRetry(Bt
d6c0: 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e  ree *pRef){.  in
d6d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d6e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
d6f0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
d700: 74 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69  tex(pRef) );.  i
d710: 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73  f( pRef->inTrans
d720: 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
d730: 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63      u8 inTransac
d740: 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74  tion = pRef->pBt
d750: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  ->inTransaction;
d760: 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
d770: 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72  ity(pRef);.    r
d780: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d790: 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c  BeginTrans(pRef,
d7a0: 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70   0);.    pRef->p
d7b0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
d7c0: 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f  n = inTransactio
d7d0: 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54  n;.    pRef->inT
d7e0: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
d7f0: 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  E;.    if( rc==S
d800: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d810: 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72    pRef->pBt->nTr
d820: 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
d830: 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65   }.    btreeInte
d840: 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d  grity(pRef);.  }
d850: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d860: 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49         ../*.** I
d870: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
d880: 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
d890: 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
d8a0: 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
d8b0: 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
d8c0: 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
d8d0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
d8e0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
d8f0: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
d900: 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
d910: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
d920: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
d930: 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
d940: 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
d950: 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
d960: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
d970: 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61  e are any outsta
d980: 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74  nding cursors, t
d990: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
d9a0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
d9b0: 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
d9c0: 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
d9d0: 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
d9e0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
d9f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
da00: 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
da10: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
da20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
da30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
da40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
da50: 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
da60: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
da70: 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f  E && pBt->pCurso
da80: 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61  r==0 && pBt->pPa
da90: 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ge1!=0 ){.    if
daa0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
dab0: 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
dac0: 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20  er)>=1 ){.      
dad0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
dae0: 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69  ge1->aData );.#i
daf0: 66 20 30 0a 20 20 20 20 20 20 69 66 28 20 70 42  f 0.      if( pB
db00: 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
db10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  ==0 ){.        M
db20: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
db30: 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
db40: 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74       pPage->aDat
db50: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
db60: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
db70: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
db80: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
db90: 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  t;.        pPage
dba0: 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20  ->pgno = 1;.    
dbb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
dbc0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
dbd0: 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  ->pPage1);.    }
dbe0: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
dbf0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69   = 0;.    pBt->i
dc00: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  nStmt = 0;.  }.}
dc10: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
dc20: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62 79   new database by
dc30: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
dc40: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
dc50: 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a  the.** file..*/.
dc60: 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
dc70: 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
dc80: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
dc90: 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
dca0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
dcb0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50  int rc;.  int nP
dcc0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
dcd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
dce0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
dcf0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
dd00: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
dd10: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
dd20: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
dd30: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67  QLITE_OK || nPag
dd40: 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
dd50: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20  n rc;.  }.  pP1 
dd60: 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
dd70: 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
dd80: 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
dd90: 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
dda0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
ddb0: 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
ddc0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
ddd0: 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
dde0: 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
ddf0: 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
de00: 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
de10: 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
de20: 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
de30: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
de40: 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
de50: 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
de60: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
de70: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d   = 1;.  data[20]
de80: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
de90: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
dea0: 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  ze;.  data[21] =
deb0: 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
dec0: 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
ded0: 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
dee0: 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
def0: 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
df00: 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
df10: 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
df20: 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
df30: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
df40: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
df50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
df60: 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
df70: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
df80: 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
df90: 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
dfa0: 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
dfb0: 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
dfc0: 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
dfd0: 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
dfe0: 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
dff0: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
e000: 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
e010: 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
e020: 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
e030: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
e040: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e050: 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
e060: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
e070: 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
e080: 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
e090: 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
e0a0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
e0b0: 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
e0c0: 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
e0d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
e0e0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
e0f0: 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
e100: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
e110: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
e120: 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
e130: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
e140: 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
e150: 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
e160: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
e170: 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
e180: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
e190: 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
e1a0: 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
e1b0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
e1c0: 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
e1d0: 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
e1e0: 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
e1f0: 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
e200: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
e210: 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
e220: 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
e230: 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
e240: 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
e250: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
e260: 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
e270: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
e280: 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
e290: 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
e2a0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
e2b0: 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
e2c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
e2d0: 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
e2e0: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
e2f0: 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
e300: 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
e310: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
e320: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
e330: 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
e340: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
e350: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
e360: 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
e370: 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
e380: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
e390: 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
e3a0: 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
e3b0: 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
e3c0: 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
e3d0: 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
e3e0: 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
e3f0: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
e400: 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
e410: 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
e420: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
e430: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
e440: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
e450: 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
e460: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
e470: 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
e480: 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
e490: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
e4a0: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
e4b0: 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
e4c0: 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
e4d0: 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
e4e0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
e4f0: 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
e500: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
e510: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
e520: 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
e530: 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
e540: 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
e550: 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
e560: 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
e570: 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
e580: 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
e590: 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
e5a0: 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
e5b0: 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
e5c0: 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
e5d0: 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
e5e0: 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
e5f0: 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
e600: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
e610: 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
e620: 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
e630: 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
e640: 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
e650: 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
e660: 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
e670: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
e680: 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
e690: 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
e6a0: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
e6b0: 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
e6c0: 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
e6d0: 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
e6e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
e6f0: 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
e700: 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
e710: 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
e720: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
e730: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e740: 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
e750: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
e760: 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
e770: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
e780: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
e790: 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
e7a0: 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
e7b0: 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
e7c0: 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
e7d0: 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
e7e0: 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
e7f0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
e800: 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
e810: 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
e820: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
e830: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
e840: 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
e850: 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
e860: 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
e870: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
e880: 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  gun;.  }..  /* W
e890: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e8a0: 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
e8b0: 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
e8c0: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
e8d0: 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
e8e0: 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  y && wrflag ){. 
e8f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
e900: 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
e910: 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
e920: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74   }..  /* If anot
e930: 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
e940: 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
e950: 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
e960: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
e970: 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
e980: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
e990: 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
e9a0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
e9b0: 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
e9c0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
e9d0: 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
e9e0: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
e9f0: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
ea00: 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
ea10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
ea20: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  SY;.    goto tra
ea30: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
ea40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ea50: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
ea60: 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
ea70: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
ea80: 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
ea90: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
eaa0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
eab0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
eac0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
ead0: 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
eae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
eaf0: 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  Y;.        goto 
eb00: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
eb10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
eb20: 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20  endif..  do {.  
eb30: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
eb40: 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f  1==0 ){.      do
eb50: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  {.        rc = l
eb60: 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20  ockBtree(pBt);. 
eb70: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 42 74       }while( pBt
eb80: 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 72  ->pPage1==0 && r
eb90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
eba0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
ebb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ebc0: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
ebd0: 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
ebe0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
ebf0: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
ec00: 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
ec10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ec20: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
ec30: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
ec40: 61 67 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a  age, wrflag>1);.
ec50: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
ec60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ec70: 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
ec80: 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
ec90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
eca0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
ecb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ecc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  {.      if( wrfl
ecd0: 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ag ) pBt->inStmt
ece0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
ecf0: 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
ed00: 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
ed10: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
ed20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
ed30: 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
ed40: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
ed50: 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
ed60: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f  sqlite3BtreeInvo
ed70: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
ed80: 74 2c 20 30 29 20 29 3b 0a 0a 20 20 69 66 28 20  t, 0) );..  if( 
ed90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
eda0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
edb0: 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
edc0: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
edd0: 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20  ransaction++;.  
ede0: 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
edf0: 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
ee00: 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
ee10: 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
ee20: 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
ee30: 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
ee40: 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
ee50: 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
ee60: 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rans;.    }.#ifn
ee70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ee80: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
ee90: 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
eea0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
eeb0: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
eec0: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 45  );.      pBt->pE
eed0: 78 63 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20 20  xclusive = p;.  
eee0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
eef0: 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
ef00: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
ef10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
ef20: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
ef30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
ef40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ef50: 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
ef60: 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
ef70: 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
ef80: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
ef90: 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
efa0: 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
efb0: 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
efc0: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
efd0: 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
efe0: 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
eff0: 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
f000: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
f010: 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
f020: 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
f030: 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
f040: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
f050: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f070: 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
f080: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
f090: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
f0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f0b0: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
f0c0: 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
f0d0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f100: 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
f110: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
f120: 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74  Bt;.  int isInit
f130: 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
f140: 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
f150: 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
f160: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
f170: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f180: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
f190: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
f1a0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
f1b0: 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70  (pPage, pPage->p
f1c0: 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
f1d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f1e0: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
f1f0: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
f200: 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
f210: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
f220: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
f230: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
f240: 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
f250: 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
f260: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
f270: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
f280: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ll);.    if( rc!
f290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f2a0: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
f2b0: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
f2c0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
f2d0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
f2e0: 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
f2f0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
f300: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20  Cell);.      rc 
f310: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
f320: 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
f330: 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b  AP_BTREE, pgno);
f340: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
f350: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
f360: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
f370: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  s_out;.    }.  }
f380: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
f390: 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
f3a0: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
f3b0: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
f3c0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
f3d0: 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63  fset+8]);.    rc
f3e0: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
f3f0: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
f400: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
f410: 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
f420: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
f430: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
f440: 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
f450: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f460: 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
f470: 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67  Page, which is g
f480: 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
f490: 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f  a btree page, no
f4a0: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
f4b0: 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e   page, is a poin
f4c0: 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
f4d0: 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  m. Modify this p
f4e0: 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69  ointer so that i
f4f0: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69  t points to.** i
f500: 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
f510: 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
f520: 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
f530: 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  r to be modified
f540: 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  , as .** follows
f550: 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
f560: 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
f570: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
f580: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
f590: 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
f5a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f5b0: 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
f5c0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
f5d0: 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
f5e0: 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
f5f0: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
f600: 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
f610: 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
f620: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
f630: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
f640: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
f650: 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
f660: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
f670: 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
f680: 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
f690: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
f6a0: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
f6c0: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
f6d0: 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
f6e0: 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
f6f0: 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
f700: 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
f710: 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
f720: 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
f730: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f740: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
f750: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f760: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
f770: 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
f780: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
f790: 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
f7a0: 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
f7b0: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
f7c0: 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
f7d0: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
f7e0: 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
f7f0: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
f800: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f810: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
f820: 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
f830: 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
f840: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
f850: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
f860: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
f870: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
f880: 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ell;..    sqlite
f890: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
f8a0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43  Page, 0);.    nC
f8b0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
f8c0: 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
f8d0: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
f8e0: 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
f8f0: 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
f900: 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
f910: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
f920: 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
f930: 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
f940: 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o;.        sqlit
f950: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
f960: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
f970: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
f980: 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
f990: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
f9a0: 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
f9b0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
f9c0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b  o.iOverflow]) ){
f9d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
f9e0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
f9f0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
fa00: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
fa10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
fa20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
fa30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fa40: 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
fa50: 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
fa60: 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
fa70: 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
fa80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
fa90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
faa0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
fab0: 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
fac0: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
fad0: 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
fae0: 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
faf0: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
fb00: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
fb10: 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
fb20: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
fb30: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fb40: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
fb50: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
fb60: 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
fb70: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
fb80: 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
fb90: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
fba0: 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
fbb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fbc0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
fbd0: 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
fbe0: 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
fbf0: 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
fc00: 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
fc10: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
fc20: 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
fc30: 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
fc40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
fc50: 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
fc60: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
fc70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
fc80: 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
fc90: 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
fca0: 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
fcb0: 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
fcc0: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
fcd0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
fce0: 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
fcf0: 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
fd00: 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
fd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
fd20: 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
fd30: 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
fd40: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
fd50: 46 72 65 65 50 61 67 65 20 20 20 20 20 20 20 20  FreePage        
fd60: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
fd70: 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
fd80: 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ge to */.){.  Me
fd90: 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
fda0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
fdb0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
fdc0: 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
fdd0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
fde0: 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
fdf0: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
fe00: 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
fe10: 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
fe20: 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
fe30: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
fe40: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
fe50: 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
fe60: 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
fe70: 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
fe80: 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
fe90: 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
fea0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
feb0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
fec0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
fed0: 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
fee0: 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
fef0: 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
ff00: 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
ff10: 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
ff20: 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
ff30: 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
ff40: 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
ff50: 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
ff60: 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
ff70: 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
ff80: 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
ff90: 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
ffa0: 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
ffb0: 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
ffc0: 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
ffd0: 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
ffe0: 72 65 65 50 61 67 65 29 3b 0a 20 20 69 66 28 20  reePage);.  if( 
fff0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10000 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10010 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
10020 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
10030 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
10040 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
10050 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
10060 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
10070 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
10080 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
10090 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
100a0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
100b0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
100c0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
100d0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
100e0 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
100f0 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
10100 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
10110 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
10120 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
10130 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
10140 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
10150 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
10160 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
10170 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
10180 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
10190 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
101a0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
101b0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
101c0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
101d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
101e0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
101f0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
10200 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
10210 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
10220 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10250 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
10260 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
10270 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
10280 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
10290 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
102a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
102b0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
102c0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
102d0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
102e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
102f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10300 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10320 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
10330 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
10340 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
10350 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
10360 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
10370 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
10380 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
10390 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
103a0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
103b0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
103c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
103d0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
103e0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
103f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
10400 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
10410 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
10420 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10440 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10450 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
10460 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
10470 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
10480 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
104a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
104b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
104c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
104d0 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
104e0 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
104f0 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
10500 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
10510 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10520 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
10530 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10540 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
10550 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
10560 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
10570 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  PtrPage);.    }.
10580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10590 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
105a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
105b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
105c0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50  int rc;.  int nP
105d0 61 67 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  age;.  rc = sqli
105e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
105f0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
10600 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  );.  return (rc=
10610 3d 53 51 4c 49 54 45 5f 4f 4b 3f 6e 50 61 67 65  =SQLITE_OK?nPage
10620 3a 2d 31 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  :-1);.}../* Forw
10630 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
10640 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
10650 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
10660 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
10670 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
10680 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
10690 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
106a0 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
106b0 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
106c0 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
106d0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
106e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
106f0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
10700 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
10710 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
10720 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a  nd therefore no.
10730 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c  ** point in call
10740 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
10750 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
10760 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
10770 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
10780 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  cly, this functi
10790 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
107a0 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a  e-organize the .
107b0 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74  ** database so t
107c0 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
107d0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
107e0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a  rrently in use.*
107f0 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  * is no longer i
10800 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n use..**.** If 
10810 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74  the nFin paramet
10820 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
10830 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
10840 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68  on assumes.** th
10850 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  at the caller wi
10860 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
10870 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
10880 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74   until.** it ret
10890 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
108a0 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e   or an error, an
108b0 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74  d that nFin is t
108c0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
108d0 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61  pages the databa
108e0 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e  se file will con
108f0 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20  tain after this 
10900 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63  .** process is c
10910 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74  omplete..*/.stat
10920 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
10930 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
10940 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29 7b  pBt, Pgno nFin){
10950 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 3b  .  Pgno iLastPg;
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10970 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  Last page in the
10980 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
10990 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
109a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
109b0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
109c0 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
109d0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
109e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
109f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10a00 29 3b 0a 20 20 69 4c 61 73 74 50 67 20 3d 20 70  );.  iLastPg = p
10a10 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 69 66  Bt->nTrunc;.  if
10a20 28 20 69 4c 61 73 74 50 67 3d 3d 30 20 29 7b 0a  ( iLastPg==0 ){.
10a30 20 20 20 20 69 4c 61 73 74 50 67 20 3d 20 70 61      iLastPg = pa
10a40 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
10a50 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  ->pPager);.  }..
10a60 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
10a70 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
10a80 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
10a90 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
10aa0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  (pBt) ){.    int
10ab0 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79 70   rc;.    u8 eTyp
10ac0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
10ad0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
10ae0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
10af0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
10b00 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
10b10 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c  ( nFreeList==0 |
10b20 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20  | nFin==iLastPg 
10b30 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10b40 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10b50 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
10b60 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
10b70 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
10b80 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
10b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10ba0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10bb0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
10bc0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
10bd0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
10be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10bf0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
10c00 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
10c10 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
10c20 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
10c30 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
10c40 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
10c50 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
10c60 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
10c70 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
10c80 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
10c90 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
10ca0 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
10cb0 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
10cc0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
10cd0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
10ce0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
10cf0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
10d00 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
10d10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
10d20 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
10d30 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
10d40 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
10d50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10d60 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
10d70 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
10d80 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
10d90 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
10da0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
10db0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
10dc0 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
10dd0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
10de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10e00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10e10 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
10e20 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
10e30 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
10e40 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
10e50 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
10e60 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
10e70 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
10e80 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
10e90 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
10ea0 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
10eb0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
10ec0 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
10ed0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
10ee0 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
10ef0 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
10f00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10f20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10f30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10f40 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72  * If nFin is zer
10f50 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
10f60 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
10f70 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
10f80 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
10f90 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
10fa0 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
10fb0 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
10fc0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
10fd0 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
10fe0 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e  other hand, if n
10ff0 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74  Fin is greater t
11000 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
11010 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
11020 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
11030 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
11040 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
11050 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
11060 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
11070 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
11080 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  */.      do {.  
11090 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
110a0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
110b0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
110c0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
110d0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
110e0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
110f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
11110 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
11120 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
11130 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
11140 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
11150 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
11160 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e  .      }while( n
11170 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50  Fin!=0 && iFreeP
11180 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
11190 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
111a0 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
111b0 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c   .      rc = sql
111c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
111d0 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29  LastPg->pDbPage)
111e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
111f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11200 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
11210 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
11220 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
11230 50 61 67 65 2c 20 69 46 72 65 65 50 67 29 3b 0a  Page, iFreePg);.
11240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
11250 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
11260 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
11270 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11280 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
112a0 20 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75    }..  pBt->nTru
112b0 6e 63 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31  nc = iLastPg - 1
112c0 3b 0a 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e  ;.  while( pBt->
112d0 6e 54 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f  nTrunc==PENDING_
112e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c  BYTE_PAGE(pBt)||
112f0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
11300 74 2c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20  t, pBt->nTrunc) 
11310 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  ){.    pBt->nTru
11320 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nc--;.  }.  retu
11330 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11340 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
11350 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
11360 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
11370 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
11380 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
11390 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
113a0 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
113b0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
113c0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
113d0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
113e0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
113f0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
11400 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
11410 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
11420 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
11430 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
11440 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
11450 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a  rror occured,.**
11460 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11470 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11480 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
11490 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
114a0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
114b0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
114c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
114d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
114e0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
114f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11500 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
11510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11520 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11530 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
11540 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
11550 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
11560 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
11570 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11580 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
11590 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  e{.    invalidat
115a0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
115b0 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
115c0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
115d0 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  pBt, 0);.  }.  s
115e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
115f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
11600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11610 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11620 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
11630 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
11640 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
11650 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
11660 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
11670 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
11680 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
11690 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
116a0 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
116b0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
116c0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
116d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
116e0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
116f0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
11700 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
11710 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
11720 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
11730 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
11740 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
11750 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
11760 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
11770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
11780 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
11790 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
117a0 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20  no *pnTrunc){.  
117b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
117c0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
117d0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
117e0 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  r;.#ifndef NDEBU
117f0 47 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  G.  int nRef = s
11800 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
11810 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 65 6e  unt(pPager);.#en
11820 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73  dif..  assert( s
11830 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11840 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
11850 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
11860 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
11870 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
11880 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
11890 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
118a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
118b0 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20  o nFin = 0;..   
118c0 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
118d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ==0 ){.      Pgn
118e0 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 20 20 50  o nFree;.      P
118f0 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  gno nPtrmap;.   
11900 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73     const int pgs
11910 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  z = pBt->pageSiz
11920 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  e;.      int nOr
11930 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ig = pagerPageco
11940 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
11950 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54 52  ;..      if( PTR
11960 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
11970 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20  nOrig) ){.      
11980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11990 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
119a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
119b0 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
119c0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
119d0 0a 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d  .        nOrig--
119e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
119f0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
11a00 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
11a10 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20  Data[36]);.     
11a20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
11a30 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
11a40 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
11a50 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f  )+pgsz/5)/(pgsz/
11a60 35 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d  5);.      nFin =
11a70 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
11a80 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20   nPtrmap;.      
11a90 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
11aa0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
11ab0 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e   && nFin<=PENDIN
11ac0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
11ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e   ){.        nFin
11ae0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
11af0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
11b00 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
11b10 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
11b20 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
11b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69  ) ){.        nFi
11b40 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n--;.      }.   
11b50 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72   }..    while( r
11b60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11b70 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
11b80 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
11b90 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Fin);.    }.    
11ba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
11bb0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ONE ){.      ass
11bc0 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70  ert(nFin==0 || p
11bd0 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c  Bt->nTrunc==0 ||
11be0 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75   nFin<=pBt->nTru
11bf0 6e 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nc);.      rc = 
11c00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
11c10 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
11c20 20 26 26 20 6e 46 69 6e 20 29 7b 0a 20 20 20 20   && nFin ){.    
11c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11c40 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
11c50 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
11c60 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
11c70 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
11c80 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
11c90 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
11ca0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
11cb0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
11cc0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e        pBt->nTrun
11cd0 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  c = nFin;.      
11ce0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
11cf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
11d10 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
11d20 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
11d30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72  _OK ){.    *pnTr
11d50 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  unc = pBt->nTrun
11d60 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  c;.    pBt->nTru
11d70 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  nc = 0;.  }.  as
11d80 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
11d90 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
11da0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
11db0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
11dc0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
11dd0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
11de0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
11df0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
11e00 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
11e10 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
11e20 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
11e30 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
11e40 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
11e50 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
11e60 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
11e70 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
11e80 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
11e90 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
11ea0 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
11eb0 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
11ec0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
11ed0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
11ee0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
11ef0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
11f00 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11f10 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
11f20 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
11f30 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
11f40 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
11f50 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
11f60 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
11f70 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11f80 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
11f90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11fa0 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
11fb0 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
11fc0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
11fd0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
11fe0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
11ff0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
12000 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
12010 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
12020 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
12030 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
12040 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
12050 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
12060 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f  BtreeCommit() fo
12070 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
12080 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
12090 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
120a0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
120b0 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
120c0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
120d0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
120e0 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
120f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
12100 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
12110 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
12120 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
12130 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
12140 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
12150 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
12160 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
12170 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
12180 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
12190 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
121a0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
121b0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
121c0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
121d0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
121e0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
121f0 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
12200 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
12210 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
12220 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
12230 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
12240 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
12250 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
12260 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
12270 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
12280 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
12290 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
122a0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
122b0 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
122c0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
122d0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
122e0 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
122f0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
12300 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
12310 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
12320 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
12330 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
12340 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
12350 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12360 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
12370 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
12380 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
12390 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
123a0 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20      Pgno nTrunc 
123b0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
123c0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
123d0 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e     pBt->db = p->
123e0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
123f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12400 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
12410 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
12420 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
12430 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26  uumCommit(pBt, &
12440 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20  nTrunc); .      
12450 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12460 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
12470 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12480 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12490 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
124a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
124b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
124c0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
124d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
124e0 74 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b  ter, nTrunc, 0);
124f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
12500 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
12510 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12520 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
12530 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
12540 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
12550 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12560 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
12570 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
12580 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
12590 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
125a0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
125b0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
125c0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
125d0 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  nd should be inv
125e0 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  oked.** prior to
125f0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
12600 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
12610 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
12620 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c  outine did.** al
12630 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
12640 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
12650 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
12660 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
12670 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
12680 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
12690 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
126a0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
126b0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
126c0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
126d0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
126e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
126f0 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63  rnal.** (which c
12700 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
12710 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
12720 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e   and drop locks.
12730 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
12740 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
12750 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
12760 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
12770 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
12780 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
12790 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
127a0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
127b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
127c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
127d0 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
127e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
127f0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
12800 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12810 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
12820 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  >db;.  btreeInte
12830 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
12840 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
12850 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
12860 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
12870 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
12880 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
12890 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
128a0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
128b0 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
128c0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
128d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
128e0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
128f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
12900 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
12910 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
12920 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12930 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
12940 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12950 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
12960 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
12970 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
12980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12990 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
129a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
129b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
129c0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
129d0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
129e0 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69  READ;.    pBt->i
129f0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
12a00 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
12a10 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
12a20 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79  e handle has any
12a30 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
12a40 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
12a50 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  ment the transac
12a60 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20  tion.  ** count 
12a70 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
12a80 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
12a90 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65  saction count re
12aa0 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a  aches 0, set.  *
12ab0 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  * the shared sta
12ac0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
12ad0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
12ae0 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c  eIfUnused() call
12af0 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c   below.  ** will
12b00 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
12b10 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  r..  */.  if( p-
12b20 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
12b30 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d  NONE ){.    pBt-
12b40 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
12b50 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
12b60 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
12b70 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
12b80 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
12b90 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
12ba0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
12bb0 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20  handles current 
12bc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
12bd0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
12be0 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20  and unlock.  ** 
12bf0 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69  the pager if thi
12c00 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
12c10 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
12c20 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
12c30 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72  ..  */.  p->inTr
12c40 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
12c50 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
12c60 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
12c70 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12c80 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
12c90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
12cc0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
12cd0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
12ce0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
12cf0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
12d00 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
12d10 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
12d20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12d30 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
12d40 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
12d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12d60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12d70 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
12d80 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
12d90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12da0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12db0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
12dc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12dd0 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
12de0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
12df0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
12e00 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
12e10 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
12e20 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
12e30 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
12e40 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
12e50 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
12e60 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
12e70 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
12e80 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
12e90 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
12ea0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
12eb0 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
12ec0 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
12ed0 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
12ee0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
12ef0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
12f00 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
12f10 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
12f20 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
12f30 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
12f40 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
12f50 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
12f60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
12f70 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
12f80 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
12f90 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
12fa0 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
12fb0 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
12fc0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
12fd0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
12fe0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
12ff0 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
13000 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
13010 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
13020 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
13030 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
13040 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
13050 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
13060 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
13070 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
13080 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
13090 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
130a0 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
130b0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
130c0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
130d0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
130e0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
130f0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
13100 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
13110 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
13120 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
13130 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
13140 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
13150 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13160 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
13170 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
13180 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
13190 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
131a0 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
131b0 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
131c0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
131d0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
131e0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
131f0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
13200 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
13210 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
13220 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
13230 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
13240 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
13250 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
13260 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
13270 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
13280 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
13290 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
132a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
132b0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
132c0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
132d0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
132e0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
132f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13300 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
13310 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
13320 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
13330 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
13340 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
13350 69 6f 6e 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65  ion(p);.    p->e
13360 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
13370 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69  AULT;.    p->ski
13380 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d  p = errCode;.  }
13390 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
133a0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
133b0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
133c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
133d0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
133e0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
133f0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
13400 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
13410 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
13420 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
13430 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
13440 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
13450 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
13460 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
13470 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
13480 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
13490 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
134a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
134b0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
134c0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
134d0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
134e0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
134f0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
13500 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13510 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
13520 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13530 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13540 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
13550 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
13560 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13570 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
13580 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
13590 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
135a0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
135b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
135c0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
135d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
135e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
135f0 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
13600 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
13610 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
13620 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a   occured whilst.
13630 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
13640 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
13650 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
13660 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
13670 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
13680 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
13690 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
136a0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
136b0 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
136c0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
136d0 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
136e0 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
136f0 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
13700 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
13710 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
13720 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
13730 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
13740 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
13750 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
13760 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
13770 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
13780 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
13790 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
137a0 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
137b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
137c0 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
137d0 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
137e0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
137f0 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54  p);.  unlockAllT
13800 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28  ables(p);..  if(
13810 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
13820 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
13830 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65  int rc2;..#ifnde
13840 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13850 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
13860 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65  ->nTrunc = 0;.#e
13870 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
13880 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
13890 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
138a0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
138b0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
138c0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
138d0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
138e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
138f0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
13900 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
13910 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
13920 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
13930 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
13940 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
13950 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
13960 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
13970 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
13980 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
13990 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
139a0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
139b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
139c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
139d0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
139e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
139f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13a00 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
13a10 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
13a20 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
13a30 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
13a40 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
13a50 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
13a60 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
13a70 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
13a80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
13a90 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
13aa0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
13ab0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
13ac0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
13ad0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
13ae0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
13af0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
13b00 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
13b10 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
13b20 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74  RANS_NONE;.  pBt
13b30 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
13b40 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
13b50 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
13b60 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13b70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13b80 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13b90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
13ba0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
13bb0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
13bc0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
13bd0 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62  ion can.** can b
13be0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  e rolled back in
13bf0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
13c00 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
13c10 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74  ion..** You must
13c20 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
13c30 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72  tion before star
13c40 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
13c50 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75  ction..** The su
13c60 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
13c70 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
13c80 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20  lly if the main 
13c90 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63  transaction.** c
13ca0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
13cb0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  back..**.** Only
13cc0 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74   one subtransact
13cd0 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76  ion may be activ
13ce0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74  e at a time.  It
13cf0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
13d00 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20  try.** to start 
13d10 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63  a new subtransac
13d20 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20  tion if another 
13d30 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
13d40 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
13d50 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
13d60 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
13d70 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
13d80 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
13d90 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
13da0 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
13db0 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
13dc0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
13dd0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
13de0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
13df0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
13e00 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
13e10 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
13e20 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
13e30 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
13e40 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
13e50 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
13e60 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
13e70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13e80 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
13e90 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13ea0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
13eb0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13ec0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13ed0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
13ee0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
13ef0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
13f00 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
13f10 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72  >inStmt ){.    r
13f20 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
13f30 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
13f40 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
13f50 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
13f60 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
13f70 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13f80 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
13f90 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
13fa0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ly ? SQLITE_OK :
13fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
13fc0 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  tBegin(pBt->pPag
13fd0 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  er);.    pBt->in
13fe0 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Stmt = 1;.  }.  
13ff0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14000 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14010 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
14020 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74  mit the statment
14030 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
14040 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
14050 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a  gress.  If no.**
14060 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
14070 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20  is active, this 
14080 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
14090 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
140a0 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20  ommitStmt(Btree 
140b0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
140c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
140d0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
140e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
140f0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
14100 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  db;.  if( pBt->i
14110 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
14120 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
14130 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14140 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e  StmtCommit(pBt->
14150 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
14160 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14170 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  E_OK;.  }.  pBt-
14180 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73  >inStmt = 0;.  s
14190 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
141a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
141b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
141c0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73  ack the active s
141d0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
141e0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20  saction.  If no 
141f0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  subtransaction.*
14200 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73  * is active this
14210 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
14220 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  -op..**.** All c
14230 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
14240 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
14250 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
14260 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  ny attempt.** to
14270 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68   use a cursor th
14280 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
14290 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
142a0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  this operation.*
142b0 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  * will result in
142c0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e   an error..*/.in
142d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
142e0 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65  llbackStmt(Btree
142f0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
14300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
14310 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14320 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
14330 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14340 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
14350 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
14360 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
14370 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
14380 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
14390 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  tRollback(pBt->p
143a0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d  Pager);.    pBt-
143b0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
143c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
143d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
143e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
143f0 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
14400 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
14410 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
14420 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
14430 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f  able.  The act o
14440 66 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75  f acquiring a cu
14450 72 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64  rsor gets a read
14460 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65   lock on .** the
14470 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
14480 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
14490 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
144a0 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
144b0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
144c0 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
144d0 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
144e0 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
144f0 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
14500 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
14510 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
14520 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
14530 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
14540 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
14550 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
14560 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
14570 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
14580 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
14590 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
145a0 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
145b0 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
145c0 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
145d0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
145e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
145f0 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
14600 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
14610 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
14620 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
14630 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
14640 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
14650 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
14660 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
14670 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
14680 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
14690 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
146a0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
146b0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
146c0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
146d0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
146e0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
146f0 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
14700 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
14710 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
14720 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
14730 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
14740 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
14750 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
14760 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
14770 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
14780 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
14790 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
147a0 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
147b0 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
147c0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
147d0 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
147e0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
147f0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
14800 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
14810 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
14820 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
14830 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
14840 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
14870 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
14880 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
148b0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
148c0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
148f0 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
14900 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
14910 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
14920 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
14930 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
14940 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
14950 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
14960 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
14990 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
149a0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
149b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
149c0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
149d0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
149e0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28  utex(p) );.  if(
149f0 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69   wrFlag ){.    i
14a00 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
14a10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14a20 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
14a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14a40 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
14a50 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 20  , iTable, 0, 0) 
14a60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14a70 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
14a80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
14a90 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
14aa0 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42  {.    rc = lockB
14ab0 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
14ac0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14ad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14af0 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72  }.    if( pBt->r
14b00 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61  eadOnly && wrFla
14b10 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  g ){.      retur
14b20 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
14b30 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  Y;.    }.  }.  p
14b40 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
14b50 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
14b60 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
14b70 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
14b80 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20  pBt->pPager)==0 
14b90 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14ba0 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f  TE_EMPTY;.    go
14bb0 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
14bc0 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
14bd0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
14be0 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
14bf0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
14c00 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  ->pPage, 0);.  i
14c10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14c20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65   ){.    goto cre
14c30 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
14c40 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
14c50 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
14c60 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
14c70 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
14c80 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
14c90 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
14ca0 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  s, link the curs
14cb0 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
14cc0 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65  ared list and se
14cd0 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20  t *ppCur (the.  
14ce0 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65  ** output argume
14cf0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
14d00 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75  ion)..  */.  pCu
14d10 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
14d20 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e  eyInfo;.  pCur->
14d30 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
14d40 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ur->pBt = pBt;. 
14d50 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20   pCur->wrFlag = 
14d60 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
14d70 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
14d80 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
14d90 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
14da0 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
14db0 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
14dc0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
14dd0 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
14de0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
14df0 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ALID;..  return 
14e00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61  SQLITE_OK;..crea
14e10 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
14e20 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75 72 20  ion:.  if( pCur 
14e30 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
14e40 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ge(pCur->pPage);
14e50 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  .  }.  unlockBtr
14e60 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
14e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14e80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14e90 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
14ea0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
14ed0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
14ee0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
14f10 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
14f20 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
14f30 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
14f60 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
14f70 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
14f80 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
14f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14fa0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
14fb0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
14fc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
14ff0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
15000 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
15010 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
15020 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
15030 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
15040 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
15050 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
15060 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
15070 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
15080 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
150a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
150b0 43 75 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20  CursorSize(){.  
150c0 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74  return sizeof(Bt
150d0 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a  Cursor);.}..../*
150e0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
150f0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
15100 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
15110 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
15120 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
15130 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
15140 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
15150 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
15160 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
15170 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
15180 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
15190 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
151a0 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ree ){.    BtSha
151b0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
151c0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
151d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
151e0 65 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62  ee);.    pBt->db
151f0 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20   = pBtree->db;. 
15200 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
15210 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
15220 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
15230 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
15240 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
15250 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
15260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
15270 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
15280 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
15290 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
152a0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
152b0 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
152c0 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
152d0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
152e0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
152f0 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  );.    unlockBtr
15300 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
15310 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
15320 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
15330 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  r);.    /* sqlit
15340 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
15350 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
15360 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
15370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
15380 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15390 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61  * Make a tempora
153a0 72 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c  ry cursor by fil
153b0 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c  ling in the fiel
153c0 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a  ds of pTempCur..
153d0 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ** The temporary
153e0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f   cursor is not o
153f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73  n the cursor lis
15400 74 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e  t for the Btree.
15410 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15420 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
15430 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
15440 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65  r, BtCursor *pTe
15450 6d 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  mpCur){.  assert
15460 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
15470 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65  ex(pCur) );.  me
15480 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70  mcpy(pTempCur, p
15490 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75  Cur, sizeof(*pCu
154a0 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  r));.  pTempCur-
154b0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54  >pNext = 0;.  pT
154c0 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20  empCur->pPrev = 
154d0 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70 43 75  0;.  if( pTempCu
154e0 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20  r->pPage ){.    
154f0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
15500 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d  pTempCur->pPage-
15510 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
15520 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
15530 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
15540 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61  r such as was ma
15550 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74 65  de by the Create
15560 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28  TemporaryCursor(
15570 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62  ).** function ab
15580 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ove..*/.void sql
15590 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65  ite3BtreeRelease
155a0 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
155b0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
155c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
155d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
155e0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67    if( pCur->pPag
155f0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
15600 50 61 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d  PagerUnref(pCur-
15610 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  >pPage->pDbPage)
15620 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
15630 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
15640 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
15650 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
15660 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
15670 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
15680 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
15690 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
156a0 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65  , call.** sqlite
156b0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
156c0 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
156d0 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
156e0 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
156f0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
15700 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
15710 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
15720 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
15730 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
15740 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  f calls to sqlit
15750 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
15760 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
15770 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
15780 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
15790 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
157a0 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
157b0 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
157c0 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
157d0 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
157e0 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
157f0 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
15800 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
15810 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
15820 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
15830 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
15840 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
15850 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
15860 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
15870 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
15880 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
15890 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
158a0 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
158b0 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
158c0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
158d0 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
158e0 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
158f0 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
15900 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
15910 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
15920 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
15930 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
15940 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
15950 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65   info;.    memse
15960 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
15970 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73  of(info));.    s
15980 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
15990 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
159a0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e  , pCur->idx, &in
159b0 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
159c0 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
159d0 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
159e0 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
159f0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
15a00 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
15a10 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
15a20 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
15a30 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
15a40 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
15a50 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
15a60 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
15a70 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
15a80 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
15a90 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
15aa0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
15ab0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
15ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
15ad0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
15ae0 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
15af0 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  idx, &pCur->info
15b00 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
15b10 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
15b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
15b30 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
15b40 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
15b50 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
15b60 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
15b70 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
15b80 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
15b90 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
15ba0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
15bb0 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
15bc0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
15c00 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
15c10 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71          \.    sq
15c50 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
15c60 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
15c70 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75   pCur->idx, &pCu
15c80 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20  r->info);       
15c90 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61    \.    pCur->va
15ca0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
15ce0 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
15d30 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
15d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
15d80 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a  _MSC_VER */../*.
15d90 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
15da0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
15db0 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
15dc0 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
15dd0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
15de0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
15df0 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
15e00 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
15e10 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
15e20 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
15e30 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
15e40 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
15e50 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
15e60 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
15e70 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
15e80 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
15e90 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
15ea0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
15eb0 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
15ec0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
15ed0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
15ee0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
15ef0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
15f00 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
15f10 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
15f20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
15f30 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
15f40 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
15f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15f60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
15f70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
15f80 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
15f90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
15fa0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
15fb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
15fc0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
15fd0 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
15fe0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
15ff0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
16000 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
16010 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
16020 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
16030 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16040 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
16050 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
16060 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
16070 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
16080 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
16090 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
160a0 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
160b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
160c0 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
160d0 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
160e0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
160f0 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
16100 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
16110 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
16120 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
16130 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
16140 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
16150 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
16160 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
16170 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
16180 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
16190 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
161a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
161b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
161c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
161d0 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
161e0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
161f0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
16200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16210 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
16220 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
16230 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
16240 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
16250 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
16260 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
16270 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
16280 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  {.      /* Not p
16290 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
162a0 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a  id entry - set *
162b0 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20  pSize to 0. */. 
162c0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
162d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
162e0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
162f0 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
16300 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
16310 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
16320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16330 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
16340 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
16350 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
16360 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16370 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
16380 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
16390 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
163a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
163b0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
163c0 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
163d0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
163e0 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
163f0 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
16400 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
16410 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
16420 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
16430 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
16440 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
16450 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
16460 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
16470 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
16480 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
16490 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
164a0 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78 74  Unless pPgnoNext
164b0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61   is NULL, the pa
164c0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
164d0 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a   next overflow .
164e0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ** page in the l
164f0 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77 72  inked list is wr
16500 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
16510 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
16520 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  l.** is the last
16530 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
16540 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  ked list, *pPgno
16550 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
16560 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
16570 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
16580 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  L, *ppPage is se
16590 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  t to the MemPage
165a0 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20  * handle.** for 
165b0 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20 75  page ovfl. The u
165c0 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72 20  nderlying pager 
165d0 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62 65  page may have be
165e0 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  en requested.** 
165f0 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65  with the noConte
16600 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f 20  nt flag set, so 
16610 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61 63  the page data ac
16620 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20  cessable via.** 
16630 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79 20  this handle may 
16640 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
16650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
16660 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
16670 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
16680 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
166b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
166c0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
166d0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
166e0 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50  ge handle */.  P
166f0 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
16700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16710 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
16720 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
16730 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
16740 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
16750 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16760 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
16770 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
16780 20 4f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d 75   One of these mu
16790 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  st not be NULL. 
167a0 4f 74 68 65 72 77 69 73 65 2c 20 77 68 79 20 63  Otherwise, why c
167b0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
167c0 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70  n? */.  assert(p
167d0 70 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65  pPage || pPgnoNe
167e0 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50  xt);..  /* If pP
167f0 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c  gnoNext is NULL,
16800 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
16810 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
16820 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20  led to obtain.  
16830 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20 72 65  ** a MemPage* re
16840 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f  ference only. No
16850 20 70 61 67 65 2d 64 61 74 61 20 69 73 20 72 65   page-data is re
16860 71 75 69 72 65 64 20 69 6e 20 74 68 69 73 20 63  quired in this c
16870 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
16880 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20  !pPgnoNext ){.  
16890 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
168a0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
168b0 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c 20  , ovfl, ppPage, 
168c0 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  1);.  }..#ifndef
168d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
168e0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
168f0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
16900 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
16910 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
16920 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
16930 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
16940 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
16950 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
16960 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
16970 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
16980 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
16990 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
169a0 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
169b0 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
169c0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
169d0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
169e0 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
169f0 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
16a00 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
16a10 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
16a20 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
16a30 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
16a40 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
16a50 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
16a60 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
16a70 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
16a80 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
16a90 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
16aa0 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
16ab0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
16ac0 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
16ad0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
16ae0 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  ss<=pagerPagecou
16af0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
16b00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
16b10 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
16b20 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
16b30 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
16b40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16b50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16b60 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
16b70 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
16b80 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
16b90 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
16ba0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
16bb0 65 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ess;.      }.   
16bc0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
16bd0 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20   if( next==0 || 
16be0 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65  ppPage ){.    Me
16bf0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
16c00 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
16c10 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
16c20 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
16c30 65 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20  e, next!=0);.   
16c40 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
16c50 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
16c60 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  0);.    if( next
16c70 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
16c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
16c90 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
16ca0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
16cb0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50 61   }..    if( ppPa
16cc0 67 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  ge ){.      *ppP
16cd0 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 20  age = pPage;.   
16ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
16cf0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
16d00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
16d10 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
16d20 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
16d30 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
16d40 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
16d50 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
16d60 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
16d70 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
16d80 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
16d90 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
16da0 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
16db0 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
16dc0 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
16dd0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
16de0 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
16df0 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
16e00 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
16e10 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
16e20 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
16e30 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
16e40 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
16e50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
16e60 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
16e70 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
16e80 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
16e90 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
16ea0 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
16eb0 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
16ec0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16ed0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
16ee0 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
16ef0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
16f00 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
16f10 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
16f20 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
16f30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
16f40 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
16f50 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
16f60 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
16f70 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
16f80 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
16f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16fa0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
16fb0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
16fc0 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
16fd0 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
16fe0 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
16ff0 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
17000 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
17010 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
17020 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
17030 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
17040 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
17050 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
17060 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
17070 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
17080 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
17090 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
170a0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
170b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
170c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
170d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
170e0 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
170f0 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
17100 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
17110 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
17120 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
17130 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
17140 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
17150 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
17160 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
17170 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17180 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
17190 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
171a0 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
171b0 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
171c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
171d0 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
171e0 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
171f0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
17200 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
17210 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
17220 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
17230 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
17240 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
17250 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
17260 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
17270 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
17280 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
17290 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
172a0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
172b0 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
172c0 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
172d0 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
172e0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
172f0 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
17300 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
17310 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17320 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
17330 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65  a distinction be
17340 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61  tween key and da
17350 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72  ta..** It just r
17360 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62  eads or writes b
17370 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61  ytes from the pa
17380 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74  yload area.  Dat
17390 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65  a might .** appe
173a0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
173b0 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65  age or be scatte
173c0 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
173d0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a  ple overflow .**
173e0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
173f0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
17400 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
17410 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
17420 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
17430 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
17440 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
17450 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
17460 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
17470 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
17480 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
17490 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
174a0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
174b0 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
174c0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
174d0 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
174e0 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
174f0 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
17500 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
17510 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
17520 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
17530 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
17540 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
17550 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
17560 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
17570 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
17580 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
17590 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
175a0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
175b0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
175c0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
175d0 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
175e0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
175f0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
17600 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
17610 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
17620 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
17630 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
17640 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
17650 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
17660 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
17670 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
17680 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
17690 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
176a0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
176b0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
176c0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
176d0 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
176e0 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
176f0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
17700 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
17710 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
17720 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
17730 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  m */.  int offse
17740 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
17750 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
17760 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
17770 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  ad */.  int amt,
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17790 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
177a0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
177b0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
177c0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
177d0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
177e0 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69  er */ .  int ski
177f0 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  pKey,         /*
17800 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61   offset begins a
17810 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
17820 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
17830 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
17840 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
17850 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
17860 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
17870 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
17880 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
17890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
178a0 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
178b0 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
178c0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
178d0 3e 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 42  >pPage;     /* B
178e0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
178f0 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
17900 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
17910 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
17920 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
17930 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
17940 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
17950 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
17960 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
17970 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
17980 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
17990 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
179a0 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
179b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
179c0 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29  ert( offset>=0 )
179d0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
179e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
179f0 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
17a00 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
17a10 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
17a20 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72  nfo.pCell + pCur
17a30 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
17a40 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d    nKey = (pPage-
17a50 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43  >intKey ? 0 : pC
17a60 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
17a70 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
17a80 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  {.    offset += 
17a90 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
17aa0 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65  offset+amt > nKe
17ab0 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  y+pCur->info.nDa
17ac0 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  ta ){.    /* Try
17ad0 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
17ae0 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
17af0 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
17b00 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
17b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
17b20 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
17b30 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
17b40 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
17b50 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
17b60 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
17b70 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
17b80 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
17b90 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
17ba0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
17bb0 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
17bc0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
17bd0 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
17be0 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
17bf0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
17c00 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
17c10 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
17c20 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
17c30 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
17c40 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
17c50 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
17c60 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
17c70 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
17c80 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
17c90 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 70  nLocal;.  }..  p
17ca0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
17cb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17cc0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
17cd0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76      const int ov
17ce0 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
17cf0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
17d00 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
17d10 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
17d20 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
17d30 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
17d40 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
17d50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
17d60 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66  o.nLocal]);..#if
17d70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17d80 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a  _INCRBLOB.    /*
17d90 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c   If the isIncrbl
17da0 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
17db0 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43   set and the BtC
17dc0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
17dd0 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  ].    ** has not
17de0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
17df0 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
17e00 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73  . The array is s
17e10 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f  ized at.    ** o
17e20 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ne entry for eac
17e30 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
17e40 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
17e50 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a  chain. The.    *
17e60 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
17e70 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
17e80 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72  low page is stor
17e90 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
17ea0 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20  0],.    ** etc. 
17eb0 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20  A value of 0 in 
17ec0 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
17ed0 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74  array means "not
17ee0 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20   yet known".    
17ef0 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73  ** (the cache is
17f00 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
17f10 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
17f20 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62  f( pCur->isIncrb
17f30 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43  lobHandle && !pC
17f40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
17f50 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
17f60 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
17f70 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
17f80 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
17f90 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
17fa0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
17fb0 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29  rflow = (Pgno *)
17fc0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
17fd0 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e  o(sizeof(Pgno)*n
17fe0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Ovfl);.      if(
17ff0 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d   nOvfl && !pCur-
18000 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
18010 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18020 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
18030 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
18040 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  f the overflow p
18050 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
18060 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
18070 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  d and the.    **
18080 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
18090 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76  irst required ov
180a0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76  erflow page is v
180b0 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a  alid, skip.    *
180c0 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
180d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
180e0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
180f0 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
18100 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
18110 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49  ize] ){.      iI
18120 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
18130 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65  lSize);.      ne
18140 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
18150 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
18160 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
18170 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
18180 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
18190 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53      for( ; rc==S
181a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
181b0 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69  0 && nextPage; i
181c0 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66  Idx++){..#ifndef
181d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
181e0 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49  RBLOB.      /* I
181f0 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
18200 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
18210 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
18220 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
18230 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
18240 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
18250 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t(!pCur->aOverfl
18260 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72  ow[iIdx] || pCur
18270 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18280 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  ]==nextPage);.  
18290 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
182a0 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65  rflow[iIdx] = ne
182b0 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  xtPage;.      }.
182c0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66  #endif..      if
182d0 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
182e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
182f0 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
18300 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
18310 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
18320 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
18330 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
18340 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
18350 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
18360 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
18370 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
18380 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
18390 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
183a0 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
183b0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
183c0 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
183d0 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
183e0 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
183f0 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
18400 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
18410 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  n..        */.#i
18420 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18430 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
18440 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
18450 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
18460 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
18470 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
18480 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
18490 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
184a0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ];.        } els
184b0 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  e .#endif.      
184c0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
184d0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
184e0 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
184f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f  Page);.        o
18500 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
18510 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
18520 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
18530 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
18540 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
18550 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
18560 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
18570 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
18580 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
18590 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
185a0 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
185b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
185c0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
185d0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  ;.        int a 
185e0 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72  = amt;.        r
185f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18600 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
18610 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
18620 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
18630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61  ){.          aPa
18650 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
18660 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
18670 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
18680 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
18690 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
186a0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b           if( a +
186b0 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
186c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
186d0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
186e0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
186f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
18700 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
18710 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
18720 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  +4], pBuf, a, eO
18730 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  p, pDbPage);.   
18740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
18750 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
18760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66  );.          off
18770 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
18780 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
18790 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
187a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
187b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
187c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
187d0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
187e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
187f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18800 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
18820 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
18830 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
18840 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
18850 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
18860 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
18870 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
18880 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
18890 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
188a0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
188b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
188c0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
188d0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
188e0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
188f0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
18900 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
18910 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
18920 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
18930 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
18940 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
18950 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
18960 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
18970 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
18980 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
18990 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
189a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
189b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
189c0 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
189d0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
189e0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
189f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18a00 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18a10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18a20 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
18a30 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
18a40 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
18a50 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
18a60 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
18a70 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18a80 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
18a90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18aa0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
18ab0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18ac0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
18ad0 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
18ae0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
18af0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
18b00 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
18b10 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
18b20 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
18b30 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
18b40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18b50 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
18b60 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
18b70 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
18b80 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
18b90 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
18ba0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
18bb0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
18bc0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
18bd0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
18be0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
18bf0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
18c00 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
18c10 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
18c20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
18c30 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
18c40 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
18c50 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
18c60 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
18c70 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
18c80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18c90 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
18ca0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
18cb0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
18cc0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
18cd0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
18ce0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
18cf0 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
18d00 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
18d10 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
18d20 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
18d30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
18d40 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
18d50 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
18d60 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
18d70 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
18d80 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
18d90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18da0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
18db0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18dc0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
18dd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
18de0 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  age!=0 );.    as
18df0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
18e00 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
18e10 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
18e20 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
18e30 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
18e40 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
18e50 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  pBuf, 1, 0);.  }
18e60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18e70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
18e80 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
18e90 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
18ea0 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
18eb0 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
18ec0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
18ed0 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
18ee0 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
18ef0 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
18f00 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
18f10 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
18f20 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
18f30 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
18f40 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
18f50 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18f60 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
18f70 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
18f80 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
18f90 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
18fa0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
18fb0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
18fc0 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
18fd0 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
18fe0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
18ff0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
19000 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
19010 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
19020 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
19030 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
19040 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
19050 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
19060 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
19070 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
19080 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
19090 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
190a0 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
190b0 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
190c0 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
190d0 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
190e0 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
190f0 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
19100 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
19110 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
19120 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
19130 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79  embly.** the key
19140 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
19150 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
19160 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
19170 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
19180 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
19190 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
191a0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
191b0 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
191c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
191d0 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
191e0 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
191f0 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
19200 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
19210 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
19220 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
19230 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
19240 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
19250 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
19260 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
19270 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
19280 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
19290 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
192a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
192b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
192c0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
192d0 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
192e0 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
192f0 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
19300 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
19310 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
19320 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
19330 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
19340 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
19350 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c  ey;.  int nLocal
19360 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
19370 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  r!=0 && pCur->pP
19380 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
19390 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
193a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
193b0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
193c0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
193d0 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  r) );.  pPage = 
193e0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
193f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
19400 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
19410 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
19420 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
19430 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
19440 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
19450 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
19460 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
19470 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
19480 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
19490 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
194a0 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
194b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
194c0 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
194d0 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
194e0 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
194f0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
19500 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
19510 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
19520 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
19530 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
19540 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20  if( nLocal>nKey 
19550 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
19560 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
19570 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
19580 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
19590 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
195a0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
195b0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
195c0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
195d0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
195e0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
195f0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
19600 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
19610 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
19620 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
19630 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
19640 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
19650 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
19660 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
19670 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
19680 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
19690 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
196a0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
196b0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
196c0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
196d0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
196e0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
196f0 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
19700 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
19710 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
19720 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
19730 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
19740 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
19750 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
19760 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
19770 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
19780 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
19790 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
197a0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
197b0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
197c0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
197d0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
197e0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
197f0 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
19800 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
19810 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
19820 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19830 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
19840 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
19850 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19860 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63  ){.    return (c
19870 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
19880 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
19890 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
198a0 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20  turn 0;.}.const 
198b0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
198c0 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
198d0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
198e0 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
198f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19900 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
19910 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19920 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
19930 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
19940 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
19950 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
19960 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
19970 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
19980 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
19990 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
199a0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
199b0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
199c0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
199d0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
199e0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
199f0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
19a00 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
19a10 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
19a20 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
19a30 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
19a40 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50  pNewPage;.  MemP
19a50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20  age *pOldPage;. 
19a60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19a70 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
19a80 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19a90 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19aa0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
19ab0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19ac0 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20  VALID );.  rc = 
19ad0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
19ae0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
19af0 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 50  ewPage, pCur->pP
19b00 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
19b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e   return rc;.  pN
19b20 65 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e  ewPage->idxParen
19b30 74 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20  t = pCur->idx;. 
19b40 20 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72   pOldPage = pCur
19b50 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50  ->pPage;.  pOldP
19b60 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
19b70 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
19b80 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43  (pOldPage);.  pC
19b90 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77  ur->pPage = pNew
19ba0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64  Page;.  pCur->id
19bb0 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
19bc0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
19bd0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
19be0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
19bf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b  Page->nCell<1 ){
19c00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19c10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19c20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
19c30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19c40 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
19c50 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65   the page is the
19c60 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66   virtual root of
19c70 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   its table..**.*
19c80 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f  * The virtual ro
19c90 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20 72  ot page is the r
19ca0 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73  oot page for mos
19cb0 74 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a  t tables.  But.*
19cc0 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
19cd0 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31  rooted on page 1
19ce0 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72  , sometime the r
19cf0 65 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  eal root page.**
19d00 20 69 73 20 65 6d 70 74 79 20 65 78 63 65 70 74   is empty except
19d10 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
19d20 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68  ointer.  In such
19d30 20 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69   cases the.** vi
19d40 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
19d50 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
19d60 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
19d70 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20  er of page.** 1 
19d80 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a  is pointing to..
19d90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19da0 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65  reeIsRootPage(Me
19db0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
19dc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
19dd0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
19de0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19df0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
19e00 65 78 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74  ex) );.  pParent
19e10 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
19e20 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
19e30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
19e40 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70    if( pParent->p
19e50 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30  gno>1 ) return 0
19e60 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65  ;.  if( get2byte
19e70 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
19e80 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
19e90 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74  set+3])==0 ) ret
19ea0 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
19eb0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
19ec0 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
19ed0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
19ee0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
19ef0 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
19f00 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
19f10 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
19f20 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
19f30 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
19f40 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
19f50 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
19f60 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
19f70 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
19f80 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
19f90 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
19fa0 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
19fb0 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
19fc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
19fd0 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
19fe0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
19ff0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
1a000 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ent;.  MemPage *
1a010 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78  pPage;.  int idx
1a020 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72  Parent;..  asser
1a030 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1a040 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1a050 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1a060 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a070 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  D );.  pPage = p
1a080 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
1a090 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
1a0a0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
1a0b0 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
1a0c0 61 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20  age(pPage) );.  
1a0d0 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
1a0e0 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65  >pParent;.  asse
1a0f0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29  rt( pParent!=0 )
1a100 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20  ;.  idxParent = 
1a110 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
1a120 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1a130 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
1a140 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
1a150 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70  Page(pPage);.  p
1a160 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61  Cur->pPage = pPa
1a170 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  rent;.  pCur->in
1a180 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1a190 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1a1a0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
1a1b0 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74  Parent->idxShift
1a1c0 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ==0 );.  pCur->i
1a1d0 64 78 20 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a  dx = idxParent;.
1a1e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1a1f0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1a200 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61  root page.*/.sta
1a210 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
1a220 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
1a230 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
1a240 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
1a250 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
1a260 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
1a270 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
1a280 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1a290 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1a2a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1a2b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1a2c0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
1a2d0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1a2e0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
1a2f0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
1a300 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
1a310 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
1a320 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
1a330 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
1a340 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
1a350 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
1a360 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1a370 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1a380 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a390 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72  FAULT ){.      r
1a3a0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
1a3b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 65 61  ;.    }.    clea
1a3c0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1a3d0 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52 6f  pCur);.  }.  pRo
1a3e0 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
1a3f0 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 20 26 26  ;.  if( pRoot &&
1a400 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
1a410 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ur->pgnoRoot ){.
1a420 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1a430 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d  t->isInit );.  }
1a440 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20  else{.    if( . 
1a450 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d       SQLITE_OK!=
1a460 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74  (rc = getAndInit
1a470 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
1a480 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
1a490 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  , 0)).    ){.   
1a4a0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1a4b0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1a4c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a4d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  c;.    }.    rel
1a4e0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
1a4f0 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
1a500 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a  >pPage = pRoot;.
1a510 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20    }.  pCur->idx 
1a520 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
1a530 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1a540 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
1a550 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1a560 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52  ey = 0;.  if( pR
1a570 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  oot->nCell==0 &&
1a580 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
1a590 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
1a5a0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1a5b0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b  Root->pgno==1 );
1a5c0 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
1a5d0 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
1a5e0 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
1a5f0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1a600 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65 3e  assert( subpage>
1a610 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 );.    pCur->e
1a620 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
1a630 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
1a640 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1a650 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20   subpage);.  }. 
1a660 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1a670 28 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ((pCur->pPage->n
1a680 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
1a690 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
1a6a0 4c 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  LID);.  return r
1a6b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1a6c0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1a6d0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
1a6e0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
1a6f0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
1a700 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
1a710 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1a720 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
1a730 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
1a740 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1a750 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
1a760 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
1a770 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
1a780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a790 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
1a7a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1a7b0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
1a7c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a7d0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
1a7e0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1a7f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1a800 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1a810 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1a820 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1a830 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
1a840 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
1a850 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1a860 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  e)->leaf ){.    
1a870 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1a880 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1a890 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
1a8a0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
1a8b0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1a8c0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
1a8d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
1a8e0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1a8f0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
1a900 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1a910 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1a920 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
1a930 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
1a940 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
1a950 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
1a960 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1a970 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
1a980 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
1a990 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
1a9a0 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
1a9b0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
1a9c0 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
1a9d0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
1a9e0 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
1a9f0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
1aa00 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
1aa10 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
1aa20 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
1aa30 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
1aa40 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
1aa50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
1aa60 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
1aa70 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
1aa80 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
1aa90 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
1aaa0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
1aab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aac0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1aad0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1aae0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1aaf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ab00 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
1ab10 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1ab20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1ab30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1ab40 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1ab50 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1ab60 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
1ab70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
1ab80 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1ab90 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
1aba0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1abb0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1abc0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1abd0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  8]);.    pCur->i
1abe0 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  dx = pPage->nCel
1abf0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
1ac00 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1ac10 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
1ac20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ac30 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1ac40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31  pPage->nCell - 1
1ac50 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1ac60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1ac70 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1ac80 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1ac90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1aca0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1acb0 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
1acc0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1acd0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1ace0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1acf0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1ad00 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1ad10 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1ad20 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1ad30 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1ad40 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1ad50 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1ad60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
1ad70 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
1ad80 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1ad90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1ada0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1adb0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1adc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1add0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1ade0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1adf0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1ae00 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1ae10 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ae20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1ae30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ae40 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1ae50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ae60 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1ae70 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
1ae80 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
1ae90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1aea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aeb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1aec0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
1aed0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1aee0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
1aef0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1af00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1af10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1af20 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1af30 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1af40 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1af50 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1af60 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
1af70 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
1af80 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
1af90 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
1afa0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
1afb0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
1afc0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1afd0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1afe0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
1aff0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1b000 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1b010 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
1b020 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1b030 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1b040 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b050 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1b060 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1b070 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
1b080 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1b090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b0a0 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
1b0b0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1b0c0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1b0d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b0e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1b0f0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1b100 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1b110 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1b120 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b130 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
1b140 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1b150 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1b160 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1b170 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1b180 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
1b190 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
1b1a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b1b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b1c0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1b1d0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
1b1e0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
1b1f0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
1b200 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
1b210 20 62 79 20 70 4b 65 79 2f 6e 4b 65 79 2f 70 55   by pKey/nKey/pU
1b220 6e 4b 65 79 2e 20 52 65 74 75 72 6e 20 61 20 73  nKey. Return a s
1b230 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1b240 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1b250 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  bles, only the n
1b260 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1b270 20 75 73 65 64 2e 20 20 70 4b 65 79 20 0a 2a 2a   used.  pKey .**
1b280 20 61 6e 64 20 70 55 6e 4b 65 79 20 6d 75 73 74   and pUnKey must
1b290 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
1b2a0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 65 69 74  ndex tables, eit
1b2b0 68 65 72 20 70 55 6e 4b 65 79 0a 2a 2a 20 6d 75  her pUnKey.** mu
1b2c0 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 6b 65  st point to a ke
1b2d0 79 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  y that has alrea
1b2e0 64 79 20 62 65 65 6e 20 75 6e 70 61 63 6b 65 64  dy been unpacked
1b2f0 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 70 4b 65  , or else.** pKe
1b300 79 2f 6e 4b 65 79 20 64 65 73 63 72 69 62 65 73  y/nKey describes
1b310 20 61 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69   a blob containi
1b320 6e 67 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  ng the key..**.*
1b330 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
1b340 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
1b350 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1b360 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
1b370 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1b380 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
1b390 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
1b3a0 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
1b3b0 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
1b3c0 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
1b3d0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
1b3e0 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
1b3f0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
1b400 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
1b410 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
1b420 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
1b430 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
1b440 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75   which the.** cu
1b450 72 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20  rsor is written 
1b460 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65 73  to *pRes if pRes
1b470 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61  !=NULL.  The mea
1b480 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20  ning of.** this 
1b490 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c  value is as foll
1b4a0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
1b4b0 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
1b4c0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1b4d0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1b4e0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1b500 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65  smaller than pKe
1b510 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
1b520 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1b540 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
1b550 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
1b560 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
1b570 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
1b580 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
1b590 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1b5a0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1b5b0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1b5c0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
1b5d0 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a  y matches pKey..
1b5e0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
1b5f0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1b600 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1b610 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1b620 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1b630 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
1b640 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a  r than pKey..**.
1b650 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b660 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
1b670 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1b680 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1b690 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
1b6a0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1b6b0 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1b6c0 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72   key content for
1b6d0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20 75   indices.  Not u
1b6e0 73 65 64 20 62 79 20 74 61 62 6c 65 73 20 2a 2f  sed by tables */
1b6f0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1b700 64 20 2a 70 55 6e 4b 65 79 2c 2f 2a 20 55 6e 70  d *pUnKey,/* Unp
1b710 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
1b720 20 70 4b 65 79 20 2a 2f 0a 20 20 69 36 34 20 6e   pKey */.  i64 n
1b730 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1b740 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65    /* Size of pKe
1b750 79 2e 20 20 4f 72 20 74 68 65 20 6b 65 79 20 66  y.  Or the key f
1b760 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69  or tables */.  i
1b770 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
1b780 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1b790 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
1b7a0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
1b7b0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b7d0 20 53 65 61 72 63 68 20 72 65 73 75 6c 74 20 66   Search result f
1b7e0 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lag */.){.  int 
1b7f0 72 63 3b 0a 20 20 63 68 61 72 20 61 53 70 61 63  rc;.  char aSpac
1b800 65 5b 32 30 30 5d 3b 0a 0a 20 20 61 73 73 65 72  e[200];..  asser
1b810 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1b820 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1b830 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1b840 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1b850 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1b860 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
1b870 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
1b880 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
1b890 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
1b8a0 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
1b8b0 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
1b8c0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
1b8d0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
1b8e0 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
1b8f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b900 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d  R_VALID && pCur-
1b910 3e 76 61 6c 69 64 4e 4b 65 79 20 26 26 20 70 43  >validNKey && pC
1b920 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
1b930 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  y ){.    if( pCu
1b940 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  r->info.nKey==nK
1b950 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1b960 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1b970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b980 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1b990 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1b9a0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 6e 4b 65  r->info.nKey<nKe
1b9b0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
1b9c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
1b9d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b9e0 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 72 63 20     }.  }...  rc 
1b9f0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1ba00 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
1ba10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ba20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1ba30 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
1ba40 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1ba50 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
1ba60 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1ba70 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1ba80 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
1ba90 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1baa0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1bab0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
1bac0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1bad0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50  }.  if( pCur->pP
1bae0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1baf0 20 20 20 2f 2a 20 57 65 20 61 72 65 20 67 69 76     /* We are giv
1bb00 65 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20  en an SQL table 
1bb10 74 6f 20 73 65 61 72 63 68 2e 20 20 54 68 65 20  to search.  The 
1bb20 6b 65 79 20 69 73 20 74 68 65 20 69 6e 74 65 67  key is the integ
1bb30 65 72 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  er.    ** rowid 
1bb40 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 6e 4b 65  contained in nKe
1bb50 79 2e 20 20 70 4b 65 79 20 61 6e 64 20 70 55 6e  y.  pKey and pUn
1bb60 4b 65 79 20 73 68 6f 75 6c 64 20 62 6f 74 68 20  Key should both 
1bb70 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 61  be NULL */.    a
1bb80 73 73 65 72 74 28 20 70 55 6e 4b 65 79 3d 3d 30  ssert( pUnKey==0
1bb90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1bba0 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  pKey==0 );.  }el
1bbb0 73 65 20 69 66 28 20 70 55 6e 4b 65 79 3d 3d 30  se if( pUnKey==0
1bbc0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
1bbd0 65 20 74 6f 20 73 65 61 72 63 68 20 61 6e 20 53  e to search an S
1bbe0 51 4c 20 69 6e 64 65 78 20 75 73 69 6e 67 20 61  QL index using a
1bbf0 20 6b 65 79 20 65 6e 63 6f 64 65 64 20 61 73 20   key encoded as 
1bc00 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2a 20 54  a blob..    ** T
1bc10 68 65 20 62 6c 6f 62 20 69 73 20 66 6f 75 6e 64  he blob is found
1bc20 20 61 74 20 70 4b 65 79 20 61 6e 64 20 69 73 20   at pKey and is 
1bc30 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20 6c 65  nKey bytes in le
1bc40 6e 67 74 68 2e 20 20 55 6e 70 61 63 6b 0a 20 20  ngth.  Unpack.  
1bc50 20 20 2a 2a 20 74 68 69 73 20 6b 65 79 20 73 6f    ** this key so
1bc60 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
1bc70 20 69 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65   it. */.    asse
1bc80 72 74 28 20 70 4b 65 79 21 3d 30 20 29 3b 0a 20  rt( pKey!=0 );. 
1bc90 20 20 20 70 55 6e 4b 65 79 20 3d 20 73 71 6c 69     pUnKey = sqli
1bca0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1bcb0 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
1bcc0 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a  fo, nKey, pKey,.
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f     aSpace, sizeo
1bd00 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20  f(aSpace));.    
1bd10 69 66 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 20  if( pUnKey==0 ) 
1bd20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1bd30 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
1bd40 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 20 73    /* We are to s
1bd50 65 61 72 63 68 20 61 6e 20 53 51 4c 20 69 6e 64  earch an SQL ind
1bd60 65 78 20 75 73 69 6e 67 20 61 20 6b 65 79 20 74  ex using a key t
1bd70 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 75  hat is already u
1bd80 6e 70 61 63 6b 65 64 0a 20 20 20 20 2a 2a 20 61  npacked.    ** a
1bd90 6e 64 20 68 61 6e 64 65 64 20 74 6f 20 75 73 20  nd handed to us 
1bda0 69 6e 20 70 55 6e 4b 65 79 2e 20 2a 2f 0a 20 20  in pUnKey. */.  
1bdb0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 3d 3d    assert( pKey==
1bdc0 30 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b  0 );.  }.  for(;
1bdd0 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
1bde0 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63   upr;.    Pgno c
1bdf0 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
1be00 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1be10 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74  ->pPage;.    int
1be20 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65   c = -1;  /* pRe
1be30 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c  s return if tabl
1be40 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20  e is empty must 
1be50 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72  be -1 */.    lwr
1be60 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
1be70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
1be80 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1be90 69 6e 74 4b 65 79 20 26 26 20 70 55 6e 4b 65 79  intKey && pUnKey
1bea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1beb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1bec0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
1bed0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1bee0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1bef0 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
1bf00 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 75 70    pCur->idx = up
1bf10 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1bf20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1bf30 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20  (upr+lwr)/2;.   
1bf40 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c 3d   }.    if( lwr<=
1bf50 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a 20  upr ) for(;;){. 
1bf60 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
1bf70 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e  Key;.      i64 n
1bf80 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70  CellKey;.      p
1bf90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1bfa0 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  = 0;.      pCur-
1bfb0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1bfc0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1bfd0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1bfe0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
1bff0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
1c000 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1c010 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61 67 65  ur->idx) + pPage
1c020 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
1c030 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1c040 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
1c050 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d          u32 dumm
1c060 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
1c070 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ll += getVarint3
1c080 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b  2(pCell, dummy);
1c090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c0a0 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
1c0b0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
1c0c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
1c0d0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 6e 4b 65 79  ( nCellKey==nKey
1c0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1c0f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
1c100 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  se if( nCellKey<
1c110 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nKey ){.        
1c120 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
1c130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c140 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
1c150 4b 65 79 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  Key>nKey );.    
1c160 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
1c170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1c180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1c190 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20   available;.    
1c1a0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28      pCellKey = (
1c1b0 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c  void *)fetchPayl
1c1c0 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c  oad(pCur, &avail
1c1d0 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
1c1e0 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75    nCellKey = pCu
1c1f0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1c200 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61        if( availa
1c210 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b  ble>=nCellKey ){
1c220 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
1c230 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1c240 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79  Compare(nCellKey
1c250 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b  , pCellKey, pUnK
1c260 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
1c270 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
1c280 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
1c290 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79  Malloc( nCellKey
1c2a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1c2b0 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
1c2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1c2d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1c2f0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1c300 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c310 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c320 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
1c330 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76   0, nCellKey, (v
1c340 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b  oid *)pCellKey);
1c350 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
1c360 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1c370 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79  Compare(nCellKey
1c380 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b  , pCellKey, pUnK
1c390 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
1c3a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
1c3b0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1c3c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
1c3d0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c3f0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
1c400 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
1c410 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
1c420 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  lKey;.        if
1c430 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  ( pPage->leafDat
1c440 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  a && !pPage->lea
1c450 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
1c460 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a  wr = pCur->idx;.
1c470 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
1c480 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
1c490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c4a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c4b0 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70     if( pRes ) *p
1c4c0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
1c4d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c4e0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1c4f0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1c500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c510 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
1c520 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
1c530 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20  = pCur->idx+1;. 
1c540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c550 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e      upr = pCur->
1c560 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
1c570 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
1c580 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1c590 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
1c5a0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
1c5b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c5c0 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1c5d0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20   (lwr+upr)/2;.  
1c5e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c5f0 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20  lwr==upr+1 );.  
1c600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1c610 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
1c620 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
1c630 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1c640 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1c650 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
1c660 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
1c670 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
1c680 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1c690 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1c6a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c6b0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
1c6c0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1c6d0 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
1c6e0 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50   }.    if( chldP
1c6f0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  g==0 ){.      as
1c700 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
1c710 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
1c720 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1c730 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ll );.      if( 
1c740 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63  pRes ) *pRes = c
1c750 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1c760 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
1c770 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1c790 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20  ->idx = lwr;.   
1c7a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1c7b0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
1c7c0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1c7d0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1c7e0 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
1c7f0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
1c800 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1c810 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  ish;.  }.moveto_
1c820 66 69 6e 69 73 68 3a 0a 20 20 69 66 28 20 70 4b  finish:.  if( pK
1c830 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ey ){.    /* If 
1c840 77 65 20 63 72 65 61 74 65 64 20 6f 75 72 20 6f  we created our o
1c850 77 6e 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 20  wn unpacked key 
1c860 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
1c870 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 64  is.    ** proced
1c880 75 72 65 2c 20 74 68 65 6e 20 64 65 73 74 72 6f  ure, then destro
1c890 79 20 74 68 61 74 20 6b 65 79 20 62 65 66 6f 72  y that key befor
1c8a0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a  e returning. */.
1c8b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
1c8c0 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
1c8d0 6f 72 64 28 70 55 6e 4b 65 79 29 3b 0a 20 20 7d  ord(pUnKey);.  }
1c8e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c8f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1c900 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
1c910 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1c920 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
1c930 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
1c940 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
1c950 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
1c960 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
1c970 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
1c980 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
1c990 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1c9a0 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
1c9b0 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
1c9c0 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
1c9d0 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
1c9e0 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
1c9f0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1ca00 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1ca10 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
1ca20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ca30 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
1ca40 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1ca50 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
1ca60 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
1ca70 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
1ca80 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
1ca90 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
1caa0 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
1cab0 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
1cac0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
1cad0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
1cae0 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
1caf0 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
1cb00 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
1cb10 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
1cb20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1cb30 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1cb40 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66  nection handle f
1cb50 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
1cb60 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
1cb70 42 74 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f  BtreeCursorDb(co
1cb80 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43  nst BtCursor *pC
1cb90 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ur){.  assert( s
1cba0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1cbb0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1cbc0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1cbd0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74  return pCur->pBt
1cbe0 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree->db;.}../*.*
1cbf0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
1cc00 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
1cc10 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1cc20 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
1cc30 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
1cc40 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
1cc50 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
1cc60 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
1cc70 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
1cc80 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1cc90 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
1cca0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1ccb0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
1ccc0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
1ccd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1cce0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1ccf0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1cd00 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
1cd10 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
1cd20 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1cd30 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1cd40 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1cd50 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1cd60 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1cd70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cd80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1cd90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
1cda0 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  es!=0 );.  pPage
1cdb0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1cdc0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1cdd0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1cde0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
1cdf0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1ce00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ce10 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
1ce20 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
1ce30 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
1ce40 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1ce50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ce60 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
1ce70 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1ce80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1ce90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1cea0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
1ceb0 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78   );..  pCur->idx
1cec0 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ++;.  pCur->info
1ced0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1cee0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1cef0 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  0;.  if( pCur->i
1cf00 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
1cf10 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
1cf20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1cf30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1cf40 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
1cf50 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1cf60 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1cf70 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
1cf80 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1cf90 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
1cfa0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1cfb0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1cfc0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
1cfd0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
1cfe0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1cff0 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
1d000 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
1d010 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1d020 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1d030 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1d040 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
1d050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d070 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
1d080 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1d090 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
1d0a0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77  r->pPage;.    }w
1d0b0 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e  hile( pCur->idx>
1d0c0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
1d0d0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1d0e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1d0f0 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
1d100 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1d110 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
1d120 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1d130 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d140 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
1d150 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1d160 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
1d170 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1d180 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d190 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
1d1a0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1d1b0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
1d1c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
1d1d0 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
1d1e0 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
1d1f0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
1d200 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1d210 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1d220 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1d230 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1d240 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1d250 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1d260 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1d270 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1d280 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
1d290 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1d2a0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
1d2b0 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
1d2c0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
1d2d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d2e0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1d2f0 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  t rc;.  Pgno pgn
1d300 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  o;.  MemPage *pP
1d310 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1d320 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1d330 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1d340 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
1d350 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1d360 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
1d370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d380 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1d390 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
1d3a0 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
1d3b0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1d3c0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
1d3d0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1d3e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d3f0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
1d400 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip<0 ){.    pCur
1d410 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
1d420 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
1d430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d440 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
1d450 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  p = 0;..  pPage 
1d460 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1d470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1d480 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
1d490 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
1d4a0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
1d4b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1d4c0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20 66  no = get4byte( f
1d4d0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1d4e0 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20  Cur->idx) );.   
1d4f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1d500 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
1d510 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1d520 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d530 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76    }.    rc = mov
1d540 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
1d550 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1d560 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64   while( pCur->id
1d570 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  x==0 ){.      if
1d580 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
1d590 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20  RootPage(pPage) 
1d5a0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
1d5b0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1d5c0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1d5d0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1d5e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d5f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1d600 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1d610 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43  eMoveToParent(pC
1d620 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
1d630 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1d640 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
1d650 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d  idx--;.    pCur-
1d660 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1d670 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1d680 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  NKey = 0;.    if
1d690 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  ( pPage->leafDat
1d6a0 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  a && !pPage->lea
1d6b0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1d6c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1d6d0 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
1d6e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d6f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d700 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
1d710 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
1d720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d730 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
1d740 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
1d750 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1d760 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
1d770 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
1d780 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
1d790 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
1d7a0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
1d7b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1d7c0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
1d7d0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
1d7e0 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
1d7f0 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
1d800 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
1d810 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
1d820 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
1d830 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
1d840 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
1d850 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
1d860 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
1d870 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1d880 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
1d890 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
1d8a0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1d8b0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
1d8c0 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
1d8d0 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
1d8e0 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
1d8f0 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
1d900 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
1d910 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d920 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
1d930 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
1d940 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1d950 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
1d960 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
1d970 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
1d980 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
1d990 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
1d9a0 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
1d9b0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
1d9c0 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
1d9d0 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
1d9e0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
1d9f0 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
1da00 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
1da10 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
1da20 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
1da30 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
1da40 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
1da50 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
1da60 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
1da70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
1da80 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
1da90 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
1daa0 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
1dab0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
1dac0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
1dad0 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
1dae0 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
1daf0 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
1db00 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1db10 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
1db20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
1db30 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1db40 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1db50 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
1db60 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
1db70 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
1db80 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
1db90 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
1dba0 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
1dbb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1dbc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1dbd0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
1dbe0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1dbf0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
1dc00 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt k;     /* Num
1dc10 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
1dc20 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
1dc30 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1dc40 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
1dc50 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1dc60 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
1dc70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1dc80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1dc90 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
1dca0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1dcb0 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  ge1;.  n = get4b
1dcc0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1dcd0 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
1dce0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
1dcf0 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
1dd00 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
1dd10 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
1dd20 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
1dd30 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
1dd40 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
1dd50 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
1dd60 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
1dd70 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
1dd80 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
1dd90 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
1dda0 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
1ddb0 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
1ddc0 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
1ddd0 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
1dde0 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
1ddf0 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
1de00 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
1de10 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
1de20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
1de30 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
1de40 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
1de50 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
1de60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1de70 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1de80 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
1de90 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  by<=pagerPagecou
1dea0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1deb0 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
1dec0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1ded0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
1dee0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1def0 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
1df00 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1df10 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
1df20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
1df30 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1df40 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
1df50 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1df60 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1df70 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
1df80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1df90 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
1dfa0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1dfb0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1dfc0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
1dfd0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
1dfe0 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
1dff0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
1e000 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
1e010 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
1e020 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
1e030 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
1e040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e050 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1e060 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1e070 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1e080 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
1e090 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e0a0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
1e0b0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
1e0c0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
1e0d0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
1e0e0 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
1e0f0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1e100 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
1e110 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
1e120 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1e130 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
1e140 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
1e150 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
1e160 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
1e170 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
1e180 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
1e190 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
1e1a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
1e1b0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1e1c0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1e1d0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1e1e0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
1e1f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e200 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1e210 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e220 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
1e230 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e240 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1e250 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
1e260 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nk, 0);.      if
1e270 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1e280 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1e290 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1e2a0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1e2b0 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
1e2c0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1e2d0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
1e2e0 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
1e2f0 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
1e300 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1e310 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
1e320 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
1e330 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
1e340 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
1e350 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
1e360 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
1e370 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
1e380 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
1e390 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
1e3a0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
1e3b0 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
1e3c0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
1e3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e3e0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1e3f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e400 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e410 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e420 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
1e440 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
1e450 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1e460 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1e470 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1e480 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1e490 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1e4a0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
1e4b0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1e4c0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1e4d0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1e4e0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1e4f0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1e500 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1e510 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
1e520 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
1e530 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
1e540 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
1e550 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
1e560 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1e570 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e580 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e590 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1e5a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
1e5b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e5c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1e5d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1e5e0 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
1e5f0 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
1e600 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
1e610 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
1e620 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
1e630 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
1e640 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
1e650 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
1e660 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
1e670 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
1e680 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e690 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1e6a0 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
1e6b0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1e6c0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1e6d0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1e6e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e6f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e700 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1e710 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1e720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1e730 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e740 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1e750 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
1e760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1e770 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1e780 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1e790 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1e7a0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1e7b0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1e7c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e7d0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1e7e0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
1e7f0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1e800 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1e810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e830 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1e840 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
1e850 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1e860 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
1e870 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
1e880 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
1e890 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
1e8a0 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
1e8b0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
1e8c0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
1e8d0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
1e8e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e8f0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
1e900 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
1e910 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
1e920 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1e930 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
1e940 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1e950 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1e960 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
1e970 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
1e980 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1e9b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e9c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1e9d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e9e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e9f0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
1ea00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1ea10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ea20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ea30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1ea40 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1ea50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1ea60 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1ea70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ea80 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1ea90 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1eaa0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1eab0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1eac0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
1ead0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
1eae0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
1eaf0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1eb00 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
1eb10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
1eb20 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
1eb30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1eb40 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
1eb50 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1eb60 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1eb70 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1eb80 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1eb90 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
1eba0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1ebb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1ebc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1ebd0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
1ebe0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1ebf0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
1ec10 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1ec20 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1ec30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1ec40 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
1ec50 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1ec60 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1ec70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ec80 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
1ec90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
1eca0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1ecb0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
1ecc0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
1ecd0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
1ece0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1ecf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1ed00 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
1ed10 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
1ed20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
1ed30 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
1ed40 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
1ed50 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ed60 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
1ed70 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
1ed80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ed90 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1eda0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1edb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1edc0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1edd0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1ede0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1edf0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
1ee00 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
1ee10 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1ee20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1ee30 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
1ee40 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
1ee50 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
1ee60 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
1ee70 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
1ee80 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1ee90 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
1eea0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
1eeb0 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
1eec0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
1eed0 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1eee0 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
1eef0 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
1ef00 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
1ef10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1ef20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
1ef30 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
1ef40 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
1ef50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1ef60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ef70 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1ef80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1ef90 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
1efa0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1efb0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
1efc0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
1efd0 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
1efe0 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
1eff0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
1f000 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
1f010 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
1f020 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61 67       nPage = pag
1f030 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1f040 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
1f050 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e      if( *pPgno>n
1f060 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
1f070 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65      /* Free page
1f080 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1f090 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
1f0a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1f0b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1f0d0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1f0e0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1f0f0 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  }.          TRAC
1f100 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1f110 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
1f120 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
1f150 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
1f160 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
1f170 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
1f180 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
1f190 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
1f1a0 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
1f1b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f1c0 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
1f1d0 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
1f1e0 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
1f1f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f200 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
1f210 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
1f220 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1f230 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1f240 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
1f250 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20  pPage, 1);.     
1f260 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f280 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f290 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28  erDontRollback((
1f2a0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
1f2b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f2c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f2d0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
1f2e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f2f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1f300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f310 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
1f320 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1f330 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f340 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f350 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1f360 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1f370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
1f380 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1f390 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
1f3a0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
1f3b0 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
1f3c0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1f3d0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1f3e0 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
1f3f0 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
1f400 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
1f410 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
1f420 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
1f430 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
1f440 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1f450 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1f460 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20   *pPgno = nPage 
1f470 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  + 1;..#ifndef SQ
1f480 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f490 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1f4a0 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
1f4b0 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63    /* An incr-vac
1f4c0 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20  uum has already 
1f4d0 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  run within this 
1f4e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
1f4f0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  the.      ** pag
1f500 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73  e to allocate is
1f510 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68   not from the ph
1f520 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68  ysical end of th
1f530 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20  e file, but.    
1f540 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72    ** at pBt->nTr
1f550 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  unc. .      */. 
1f560 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42       *pPgno = pB
1f570 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20  t->nTrunc+1;.   
1f580 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50     if( *pPgno==P
1f590 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1f5a0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
1f5b0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
1f5c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1f5d0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1f5e0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
1f5f0 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
1f600 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1f610 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
1f620 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
1f630 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
1f640 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
1f650 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
1f660 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
1f670 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
1f680 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
1f690 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
1f6a0 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
1f6b0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
1f6c0 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
1f6d0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
1f6e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
1f6f0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1f700 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
1f710 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
1f720 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67  p page)\n", *pPg
1f730 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  no));.      asse
1f740 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1f750 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f760 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50  t) );.      (*pP
1f770 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66  gno)++;.      if
1f780 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
1f790 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f7a0 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20   ){ (*pPgno)++; 
1f7b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1f7c0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
1f7d0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63       pBt->nTrunc
1f7e0 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d   = *pPgno;.    }
1f7f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
1f800 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1f810 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f820 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
1f830 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
1f840 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
1f850 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
1f860 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f870 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
1f880 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f890 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1f8a0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1f8b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f8c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f8d0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
1f8e0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1f8f0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
1f900 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
1f910 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
1f920 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1f930 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1f940 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
1f950 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
1f960 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1f970 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
1f980 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
1f990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f9a0 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20  *.** Add a page 
1f9b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f9c0 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65  file to the free
1f9d0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  list..**.** sqli
1f9e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1f9f0 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f  is NOT called fo
1fa00 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
1fa10 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28  ic int freePage(
1fa20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1fa30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1fa40 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1fa50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1fa60 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1fa70 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a    int rc, n, k;.
1fa80 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68  .  /* Prepare th
1fa90 65 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69  e page for freei
1faa0 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ng */.  assert( 
1fab0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1fac0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1fad0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1fae0 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31  t( pPage->pgno>1
1faf0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   );.  pPage->isI
1fb00 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nit = 0;.  relea
1fb10 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50  sePage(pPage->pP
1fb20 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d  arent);.  pPage-
1fb30 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20  >pParent = 0;.. 
1fb40 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1fb50 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
1fb60 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
1fb70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fb80 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1fb90 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
1fba0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1fbb0 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
1fbc0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1fbd0 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
1fbe0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1fbf0 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66  ], n+1);..#ifdef
1fc00 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1fc10 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68  ELETE.  /* If th
1fc20 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  e SQLITE_SECURE_
1fc30 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74  DELETE compile-t
1fc40 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ime option is en
1fc50 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  abled, then.  **
1fc60 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
1fc70 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
1fc80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
1fc90 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72   zeros..  */.  r
1fca0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fcb0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
1fcc0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1fcd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
1fce0 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
1fcf0 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
1fd00 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65  t->pageSize);.#e
1fd10 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1fd20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1fd30 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65  CUUM.  /* If the
1fd40 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
1fd50 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
1fd60 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
1fd70 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
1fd80 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
1fd90 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
1fda0 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
1fdb0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1fdc0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
1fdd0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1fde0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52  pPage->pgno, PTR
1fdf0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29  MAP_FREEPAGE, 0)
1fe00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1fe10 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
1fe20 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30  ndif..  if( n==0
1fe30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1fe40 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72 65  is the first fre
1fe50 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63  e page */.    rc
1fe60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1fe70 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
1fe80 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1fe90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fea0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
1feb0 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20  aData, 0, 8);.  
1fec0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1fed0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70  e1->aData[32], p
1fee0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
1fef0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1ff00 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c  GE: %d first\n",
1ff10 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
1ff20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ff30 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65 73  Other free pages
1ff40 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20   already exist. 
1ff50 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69 72   Retrive the fir
1ff60 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
1ff70 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65    ** of the free
1ff80 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75  list and find ou
1ff90 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65  t how many leave
1ffa0 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20  s it has. */.   
1ffb0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
1ffc0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1ffd0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1ffe0 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
1fff0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
20000 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
20010 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20020 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67  rn rc;.    k = g
20030 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
20040 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
20050 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62  if( k>=pBt->usab
20060 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
20070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
20080 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72  nk is full.  Tur
20090 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  n the page being
200a0 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65   freed into a ne
200b0 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b  w.      ** trunk
200c0 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65   page with no le
200d0 61 76 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  aves..      **. 
200e0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
200f0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
20100 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
20110 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
20120 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
20130 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
20140 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
20150 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
20160 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
20170 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
20180 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
20190 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
201a0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
201b0 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
201c0 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
201d0 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
201e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
201f0 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
20200 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
20210 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
20220 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
20230 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
20240 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
20250 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
20260 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
20270 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
20280 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
20290 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
202a0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74  e will contain t
202b0 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
202c0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
202d0 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
202e0 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
202f0 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
20300 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
20310 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
20320 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
20330 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
20340 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
20350 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
20360 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
20370 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
20380 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
20390 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
203a0 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
203b0 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
203c0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
203d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
203e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
203f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20410 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
20420 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75  age->aData, pTru
20430 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nk->pgno);.     
20440 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
20450 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
20460 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
20470 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20480 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
20490 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  no);.        TRA
204a0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
204b0 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
204c0 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
204d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
204e0 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
204f0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
20500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
20510 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20  e if( k<0 ){.   
20520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
20530 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73  ORRUPT;.    }els
20540 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  e{.      /* Add 
20550 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20  the newly freed 
20560 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f  page as a leaf o
20570 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
20580 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  unk */.      rc 
20590 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
205a0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
205b0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
205c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
205d0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
205e0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
205f0 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20  [4], k+1);.     
20600 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
20610 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34  unk->aData[8+k*4
20620 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
20630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20640 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
20650 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20660 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
20670 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e  e->pDbPage);.#en
20680 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
20690 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
206a0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
206b0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
206c0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
206d0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
206e0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
206f0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
20700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20710 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
20720 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
20730 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20740 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
20750 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
20760 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
20770 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
20780 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
20790 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
207a0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
207b0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
207c0 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
207d0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
207e0 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61  fl;.  int ovflPa
207f0 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
20800 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20810 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
20820 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
20830 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
20840 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
20850 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
20860 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
20870 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
20880 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
20890 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
208a0 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
208b0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
208c0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
208d0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
208e0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
208f0 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50  rflow]);.  ovflP
20900 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
20910 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
20920 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
20930 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
20940 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
20950 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
20960 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
20970 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
20980 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
20990 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
209a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
209b0 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c  fl;.    if( ovfl
209c0 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50  Pgno==0 || ovflP
209d0 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
209e0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
209f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20a00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20a10 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
20a20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
20a30 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
20a40 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76  no, &pOvfl, (nOv
20a50 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67  fl==0)?0:&ovflPg
20a60 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
20a70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
20a80 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
20a90 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ovfl);.    sqlit
20aa0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
20ab0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
20ac0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20ad0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
20ae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20af0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
20b00 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
20b10 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
20b20 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
20b30 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
20b40 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
20b50 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
20b60 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
20b70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
20b80 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
20b90 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
20ba0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
20bb0 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
20bc0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
20bd0 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
20be0 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
20bf0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
20c00 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
20c10 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
20c20 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
20c30 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
20c40 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
20c50 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
20c60 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
20c70 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
20c80 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
20c90 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
20ca0 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
20cb0 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
20cc0 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
20cd0 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
20ce0 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
20cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
20d00 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
20d10 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
20d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20d30 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
20d40 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
20d50 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
20d60 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
20d70 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
20d80 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
20d90 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
20da0 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
20db0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
20dc0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
20dd0 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
20de0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
20df0 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e10 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
20e20 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
20e30 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
20e40 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e60 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
20e70 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
20e80 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
20e90 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
20ea0 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
20eb0 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
20ec0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
20ed0 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
20ee0 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
20ef0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
20f00 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
20f10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
20f20 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
20f30 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
20f40 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
20f50 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
20f60 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
20f70 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
20f80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
20f90 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
20fa0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
20fb0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
20fc0 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
20fd0 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
20fe0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
20ff0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
21000 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
21010 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
21020 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
21030 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
21040 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
21050 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
21060 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
21070 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
21080 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
21090 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
210a0 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
210b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
210c0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
210d0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
210e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
210f0 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65  .nHeader==nHeade
21100 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r );.  assert( i
21110 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
21120 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
21130 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a  .nData==nData+nZ
21140 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ero );.  .  /* F
21150 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
21160 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
21170 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
21180 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
21190 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
211a0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
211b0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
211c0 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
211d0 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
211e0 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70  d += nKey;.    p
211f0 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
21200 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d  nSrc = nKey;.  }
21210 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
21220 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
21230 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
21240 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
21250 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
21260 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
21270 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
21280 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
21290 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
212a0 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
212b0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
212c0 73 45 78 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e  sExact = 0;.#ifn
212d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
212e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
212f0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
21300 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
21310 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
21320 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
21330 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
21340 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
21350 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
21360 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
21370 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
21380 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
21390 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
213a0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
213b0 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
213c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
213d0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
213e0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
213f0 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  Ovfl>1 ){.      
21400 20 20 20 20 2f 2a 20 69 73 45 78 61 63 74 20 3d      /* isExact =
21410 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d   1; */.        }
21420 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21430 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
21440 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
21450 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
21460 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69  vfl, pgnoOvfl, i
21470 73 45 78 61 63 74 29 3b 0a 23 69 66 6e 64 65 66  sExact);.#ifndef
21480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21490 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
214a0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
214b0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
214c0 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
214d0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
214e0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
214f0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
21500 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
21510 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
21520 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
21530 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
21540 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
21550 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
21560 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
21570 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
21580 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
21590 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
215a0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
215b0 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
215c0 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
215d0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
215e0 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
215f0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
21600 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
21610 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
21620 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
21630 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
21640 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
21650 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65  nitialised value
21660 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
21670 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
21680 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
21690 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
216a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
216b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
216c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
216d0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
216e0 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
216f0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
21700 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
21710 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
21720 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
21730 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
21740 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20  pgnoPtrmap);.   
21750 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
21760 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
21770 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
21780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
21790 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
217a0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
217b0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
217c0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
217d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
217e0 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
217f0 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
21800 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
21810 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
21820 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
21830 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
21840 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
21850 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
21860 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
21870 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
21880 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
21890 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
218a0 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
218b0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
218c0 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
218d0 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
218e0 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
218f0 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20   spaceLeft;.    
21900 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
21910 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
21920 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
21930 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
21940 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
21950 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
21960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21970 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
21980 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
21990 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
219a0 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
219b0 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
219c0 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
219d0 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
219e0 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
219f0 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
21a00 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
21a10 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
21a20 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
21a30 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
21a40 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
21a50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21a60 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21a70 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74   MemPage.pParent
21a80 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20   pointer on the 
21a90 70 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65  page whose numbe
21aa0 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e  r is.** given in
21ab0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
21ac0 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d  ment so that Mem
21ad0 50 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c  Page.pParent hol
21ae0 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65  ds the.** pointe
21af0 72 20 69 6e 20 74 68 65 20 74 68 69 72 64 20 61  r in the third a
21b00 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
21b10 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50  ic int reparentP
21b20 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  age(BtShared *pB
21b30 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65  t, Pgno pgno, Me
21b40 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e  mPage *pNewParen
21b50 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d  t, int idx){.  M
21b60 65 6d 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20  emPage *pThis;. 
21b70 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
21b80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
21b90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21ba0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
21bb0 20 61 73 73 65 72 74 28 20 70 4e 65 77 50 61 72   assert( pNewPar
21bc0 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ent!=0 );.  if( 
21bd0 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
21be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
21bf0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
21c00 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50 61 67  r!=0 );.  pDbPag
21c10 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
21c20 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
21c30 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
21c40 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
21c50 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61 67 65  pThis = (MemPage
21c60 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
21c70 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
21c80 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d  ;.    if( pThis-
21c90 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20  >isInit ){.     
21ca0 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e   assert( pThis->
21cb0 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
21cc0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
21cd0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ge) );.      if(
21ce0 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21   pThis->pParent!
21cf0 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20  =pNewParent ){. 
21d00 20 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73         if( pThis
21d10 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69  ->pParent ) sqli
21d20 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54  te3PagerUnref(pT
21d30 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44  his->pParent->pD
21d40 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
21d50 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d  pThis->pParent =
21d60 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20   pNewParent;.   
21d70 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
21d80 72 52 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d  rRef(pNewParent-
21d90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
21da0 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e   }.      pThis->
21db0 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b  idxParent = idx;
21dc0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21dd0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
21de0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  Page);.  }..#ifn
21df0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21e00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
21e10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
21e20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
21e30 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
21e40 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
21e50 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67  , pNewParent->pg
21e60 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  no);.  }.#endif.
21e70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21e80 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43  OK;.}..../*.** C
21e90 68 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e  hange the pParen
21ea0 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c  t pointer of all
21eb0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
21ec0 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b  ge to point back
21ed0 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a  .** to pPage..**
21ee0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
21ef0 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68  ds, for every ch
21f00 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e  ild of pPage, in
21f10 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67  voke reparentPag
21f20 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73  e().** to make s
21f30 75 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68  ure that each ch
21f40 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70  ild knows that p
21f50 50 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65  Page is its pare
21f60 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
21f70 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
21f80 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d  ed after you mem
21f90 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69  cpy() one page i
21fa0 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a  nto.** another..
21fb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
21fc0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
21fd0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
21fe0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53  {.  int i;.  BtS
21ff0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
22000 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72  ge->pBt;.  int r
22010 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22020 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22030 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
22040 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
22050 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
22060 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20 53 51  leaf ) return SQ
22070 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28  LITE_OK;..  for(
22080 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
22090 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
220a0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
220b0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
220c0 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
220d0 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
220e0 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65  te(pCell), pPage
220f0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , i);.    if( rc
22100 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
22110 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
22120 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65  c = reparentPage
22130 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
22140 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
22150 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
22160 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
22170 20 20 20 20 20 20 20 20 70 50 61 67 65 2c 20 69          pPage, i
22180 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  );.  pPage->idxS
22190 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  hift = 0;.  retu
221a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
221b0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
221c0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
221d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
221e0 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
221f0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
22200 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
22210 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
22220 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
22230 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
22240 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
22250 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
22260 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
22270 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
22280 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
22290 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
222a0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
222b0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
222c0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
222d0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
222e0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
222f0 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
22300 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
22310 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20  idx, int sz){.  
22320 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22330 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22340 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
22350 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
22360 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
22370 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
22380 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
22390 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
223a0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
223b0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
223c0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
223d0 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
223e0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
223f0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
22400 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
22410 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
22420 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
22430 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
22440 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
22450 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
22460 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
22470 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22480 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
22490 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
224a0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
224b0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
224c0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
224d0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
224e0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
224f0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73  byte(ptr);.  ass
22500 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70 63  ert( pc>10 && pc
22510 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz<=pPage->pBt-
22520 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
22530 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
22540 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72  , pc, sz);.  for
22550 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67  (i=idx+1; i<pPag
22560 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70  e->nCell; i++, p
22570 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b  tr+=2){.    ptr[
22580 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20  0] = ptr[2];.   
22590 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d   ptr[1] = ptr[3]
225a0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
225b0 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
225c0 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
225d0 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
225e0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
225f0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
22600 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68  ;.  pPage->idxSh
22610 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ift = 1;.}../*.*
22620 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
22630 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
22640 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
22650 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
22660 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
22670 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
22680 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
22690 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
226a0 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
226b0 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
226c0 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
226d0 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
226e0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
226f0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
22700 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
22710 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
22720 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
22730 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
22740 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
22750 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d  n pPage->aOvfl[]
22760 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
22770 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
22780 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
22790 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
227a0 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
227b0 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
227c0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
227d0 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
227e0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
227f0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
22800 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
22810 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
22820 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
22830 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
22840 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
22850 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
22860 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
22870 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
22880 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
22890 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
228a0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
228b0 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
228c0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
228d0 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
228e0 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
228f0 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
22900 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
22910 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
22920 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
22930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22940 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
22950 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
22960 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
22970 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
22980 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
22990 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
229a0 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
229b0 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
229c0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
229d0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
229e0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
229f0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
22a00 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
22a10 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
22a20 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
22a30 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
22a40 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
22a50 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
22a60 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
22a70 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20  /.  u8 nSkip    
22a80 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
22a90 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  write the first 
22aa0 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
22ab0 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  he cell */.){.  
22ac0 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
22ad0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
22ae0 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
22af0 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
22b00 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
22b10 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22b20 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
22b30 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
22b40 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f  First byte of co
22b50 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65  ntent for any ce
22b60 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ll in data[] */.
22b70 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
22b80 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
22b90 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
22ba0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
22bb0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
22bc0 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
22bd0 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
22be0 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
22bf0 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
22c00 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ted */.  int hdr
22c10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
22c20 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d  fset into data[]
22c30 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61   of the page hea
22c40 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
22c50 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
22c60 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
22c70 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
22c80 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
22c90 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
22ca0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
22cb0 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
22cc0 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
22cd0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
22ce0 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
22cf0 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
22d00 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ta[] */..  asser
22d10 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
22d20 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
22d30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
22d40 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
22d50 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
22d60 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  pCell) );.  asse
22d70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22d80 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
22d90 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
22da0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
22db0 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
22dc0 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
22dd0 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
22de0 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
22df0 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
22e00 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
22e10 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
22e20 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  mp;.    }.    j 
22e30 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
22e40 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
22e50 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65  ( j<sizeof(pPage
22e60 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
22e70 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
22e80 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
22e90 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
22ea0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
22eb0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
22ec0 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   i;.    pPage->n
22ed0 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
22ee0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
22ef0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
22f00 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
22f10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
22f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
22f40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
22f50 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
22f60 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
22f70 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
22f80 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
22f90 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  a;.    hdr = pPa
22fa0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
22fb0 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
22fc0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
22fd0 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
22fe0 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
22ff0 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
23000 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
23010 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a  age->nCell + 2;.
23020 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
23030 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
23040 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20  if( end > top - 
23050 73 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  sz ){.      rc =
23060 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
23070 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
23080 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23090 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
230a0 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
230b0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
230c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
230d0 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29  nd + sz <= top )
230e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20  ;.    }.    idx 
230f0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
23100 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20  pPage, sz);.    
23110 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b  assert( idx>0 );
23120 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64  .    assert( end
23130 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61   <= get2byte(&da
23140 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
23150 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
23160 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
23170 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d  ee -= 2;.    mem
23180 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
23190 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
231a0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
231b0 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70    for(j=end-2, p
231c0 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
231d0 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
231e0 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
231f0 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
23200 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
23210 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
23220 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
23230 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
23240 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
23250 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
23260 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78  ;.    pPage->idx
23270 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64  Shift = 1;.#ifnd
23280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23290 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
232a0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
232b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
232c0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
232d0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
232e0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
232f0 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
23300 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
23310 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
23320 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
23330 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
23340 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
23350 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
23360 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
23370 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
23380 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
23390 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73  &info);.      as
233a0 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
233b0 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
233c0 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
233d0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
233e0 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f  .      if( (info
233f0 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
23400 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
23410 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
23420 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
23430 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
23440 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
23450 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
23460 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
23470 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
23480 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
23490 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
234a0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
234b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
234c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
234d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
234e0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
234f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23500 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
23510 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
23520 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
23530 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
23540 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
23550 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
23560 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
23570 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
23580 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
23590 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
235a0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
235b0 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
235c0 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
235d0 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
235e0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
235f0 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
23600 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
23610 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
23620 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
23630 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
23640 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
23650 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
23660 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
23670 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
23680 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
23690 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
236a0 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54  talSize;    /* T
236b0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  otal size of all
236c0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20   cells */.  int 
236d0 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
236e0 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68   Index of page h
236f0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
23700 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20  ellptr;      /* 
23710 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
23720 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
23730 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
23740 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
23750 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
23760 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
23770 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
23780 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
23790 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
237a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
237b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
237c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
237d0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
237e0 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65  ) );.  totalSize
237f0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
23800 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
23810 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d      totalSize +=
23820 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20   aSize[i];.  }. 
23830 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69   assert( totalSi
23840 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67  ze+2*nCell<=pPag
23850 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73  e->nFree );.  as
23860 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
23870 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70  ll==0 );.  cellp
23880 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  tr = pPage->cell
23890 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
238a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
238b0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
238c0 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62  rOffset;.  put2b
238d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
238e0 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , nCell);.  if( 
238f0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c  nCell ){.    cel
23900 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65  lbody = allocate
23910 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74  Space(pPage, tot
23920 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73  alSize);.    ass
23930 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20  ert( cellbody>0 
23940 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
23950 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32  Page->nFree >= 2
23960 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50  *nCell );.    pP
23970 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a  age->nFree -= 2*
23980 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69  nCell;.    for(i
23990 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
239a0 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  ){.      put2byt
239b0 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d  e(&data[cellptr]
239c0 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20  , cellbody);.   
239d0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
239e0 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
239f0 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
23a00 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b  .      cellptr +
23a10 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62  = 2;.      cellb
23a20 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ody += aSize[i];
23a30 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23a40 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61  t( cellbody==pPa
23a50 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
23a60 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ize );.  }.  pPa
23a70 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  ge->nCell = nCel
23a80 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
23a90 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
23aa0 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
23ab0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
23ac0 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
23ad0 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
23ae0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
23af0 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
23b00 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
23b10 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
23b20 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
23b30 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
23b40 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
23b50 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
23b60 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
23b70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
23b80 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
23b90 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
23ba0 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
23bb0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
23bc0 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
23bd0 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
23be0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
23bf0 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
23c00 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
23c10 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
23c20 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
23c30 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
23c40 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
23c50 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
23c60 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
23c70 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
23c80 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
23c90 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
23ca0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
23cb0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
23cc0 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
23cd0 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
23ce0 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
23cf0 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
23d00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23d10 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
23d20 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
23d30 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
23d40 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
23d50 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
23d60 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
23d70 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  lance */../* For
23d80 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
23d90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
23da0 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69  ance(MemPage*, i
23db0 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nt);..#ifndef SQ
23dc0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
23dd0 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
23de0 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
23df0 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
23e00 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
23e10 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
23e20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
23e30 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
23e40 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
23e50 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
23e60 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
23e70 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
23e80 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
23e90 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
23ea0 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
23eb0 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
23ec0 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
23ed0 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
23ee0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
23ef0 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
23f00 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
23f10 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
23f20 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
23f30 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
23f40 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
23f50 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
23f60 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
23f70 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
23f80 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
23f90 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
23fa0 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
23fb0 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
23fc0 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
23fd0 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
23fe0 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
23ff0 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
24000 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
24010 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
24020 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
24030 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
24040 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
24050 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
24060 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
24070 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
24080 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
24090 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
240a0 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
240b0 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
240c0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
240d0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
240e0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
240f0 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
24100 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
24110 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74  *pParent){.  int
24120 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
24130 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  pNew;.  Pgno pgn
24140 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c  oNew;.  u8 *pCel
24150 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b  l;.  u16 szCell;
24160 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
24170 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
24180 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
24190 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20    int parentIdx 
241a0 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
241b0 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e  ;   /* pParent n
241c0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
241d0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70  index */.  int p
241e0 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  arentSize;      
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24200 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69  Size of new divi
24210 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  der cell */.  u8
24220 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b   parentCell[64];
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65  /* Space for the
24250 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
24260 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  l */..  assert( 
24270 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
24280 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
24290 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  utex) );..  /* A
242a0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
242b0 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f  ge. Insert the o
242c0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f  verflow cell fro
242d0 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74  m pPage.  ** int
242e0 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76  o it. Then remov
242f0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
24300 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
24310 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
24320 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
24330 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
24340 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  ew, 0, 0);.  if(
24350 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24360 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
24370 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70  .  }.  pCell = p
24380 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
24390 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d  Cell;.  szCell =
243a0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
243b0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65  ge, pCell);.  ze
243c0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61  roPage(pNew, pPa
243d0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  ge->aData[0]);. 
243e0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
243f0 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
24400 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  szCell);.  pPage
24410 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
24420 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70  ..  /* Set the p
24430 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  arent of the new
24440 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
24450 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  e to pParent. */
24460 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74  .  pNew->pParent
24470 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73 71   = pParent;.  sq
24480 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
24490 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
244a0 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
244b0 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69  currently the ri
244c0 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61  ght-child of pPa
244d0 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69  rent. Change thi
244e0 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74  s.  ** so that t
244f0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69  he right-child i
24500 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61  s the new page a
24510 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61  llocated above a
24520 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69 73  nd.  ** pPage is
24530 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67   the next-to-rig
24540 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a  ht child. .  */.
24550 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
24560 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 43  >nCell>0 );.  pC
24570 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
24580 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
24590 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ll-1);.  sqlite3
245a0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
245b0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
245c0 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 66  &info);.  rc = f
245d0 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
245e0 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30  t, parentCell, 0
245f0 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
24600 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a  0, 0, &parentSiz
24610 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
24620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
24630 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
24640 61 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69  assert( parentSi
24650 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63 20 3d 20  ze<64 );.  rc = 
24660 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
24670 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70  nt, parentIdx, p
24680 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e  arentCell, paren
24690 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20  tSize, 0, 4);.  
246a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
246b0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
246c0 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  rc;.  }.  put4by
246d0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
246e0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72 65  ell(pParent,pare
246f0 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e 70  ntIdx), pPage->p
24700 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79 74 65  gno);.  put4byte
24710 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
24720 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
24730 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
24740 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
24750 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24760 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  M.  /* If this i
24770 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
24780 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
24790 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
247a0 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72  p.  ** with entr
247b0 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
247c0 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
247d0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
247e0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
247f0 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
24800 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
24810 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
24820 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
24830 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
24840 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
24850 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
24860 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  >pgno);.    if( 
24870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24880 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
24890 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
248a0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
248b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
248c0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
248d0 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Page(pNew);.    
248e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
248f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
24900 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
24910 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
24920 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62 61   new page and ba
24930 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
24940 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63   page,.  ** in c
24950 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72 20  ase the divider 
24960 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61  cell inserted ca
24970 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d  used it to becom
24980 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f  e overfull..  */
24990 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
249a0 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  New);.  return b
249b0 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20  alance(pParent, 
249c0 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
249d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
249e0 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  KBALANCE */../*.
249f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24a00 72 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65  redistributes Ce
24a10 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64  lls on pPage and
24a20 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c   up to NN*2 sibl
24a30 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65  ings.** of pPage
24a40 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
24a50 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
24a60 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66  e same amount of
24a70 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20   free space..** 
24a80 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69  Usually NN sibli
24a90 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ngs on either si
24aa0 64 65 20 6f 66 20 70 50 61 67 65 20 69 73 20 75  de of pPage is u
24ab0 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
24ac0 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  cing,.** though 
24ad0 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69  more siblings mi
24ae0 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
24af0 65 20 73 69 64 65 20 69 66 20 70 50 61 67 65 20  e side if pPage 
24b00 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
24b10 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
24b20 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66   its parent.  If
24b30 20 70 50 61 67 65 20 68 61 73 20 66 65 77 65 72   pPage has fewer
24b40 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69   than 2*NN sibli
24b50 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e  ngs.** (somethin
24b60 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
24b70 20 68 61 70 70 65 6e 20 69 66 20 70 50 61 67 65   happen if pPage
24b80 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
24b90 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64  e or a .** child
24ba0 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61   of root) then a
24bb0 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62  ll available sib
24bc0 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70 61 74  lings participat
24bd0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
24be0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
24bf0 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
24c00 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74 20   of pPage might 
24c10 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
24c20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
24c30 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e   or.** two in an
24c40 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20   effort to keep 
24c50 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c  pages nearly ful
24c60 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66  l but not over f
24c70 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61  ull. The root pa
24c80 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c  ge.** is special
24c90 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20   and is allowed 
24ca0 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70  to be nearly emp
24cb0 74 79 2e 20 49 66 20 70 50 61 67 65 20 69 73 20  ty. If pPage is 
24cc0 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
24cd0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70 74  e, then the dept
24ce0 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69  h of the tree mi
24cf0 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
24d00 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64  .** or decreased
24d10 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65   by one, as nece
24d20 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74  ssary, to keep t
24d30 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f  he root page fro
24d40 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  m being.** overf
24d50 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c  ull or completel
24d60 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e  y empty..**.** N
24d70 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
24d80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
24d90 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68  lled, some of th
24da0 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e Cells on pPage
24db0 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63  .** might not ac
24dc0 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64  tually be stored
24dd0 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
24de0 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  [].  This can ha
24df0 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70  ppen.** if the p
24e00 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  age is overfull.
24e10 20 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f    Part of the jo
24e20 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
24e30 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  e is to.** make 
24e40 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66  sure all Cells f
24e50 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67  or pPage once ag
24e60 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65  ain fit in pPage
24e70 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a  ->aData[]..**.**
24e80 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
24e90 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
24ea0 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
24eb0 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  e, the parent of
24ec0 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
24ed0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
24ee0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49  or underfull.  I
24ef0 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20  f that happens, 
24f00 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
24f10 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72  e.** is called r
24f20 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68  ecursively on th
24f30 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  e parent..**.** 
24f40 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
24f50 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
24f60 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
24f70 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
24f80 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
24f90 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69  ted state.  So i
24fa0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
24fb0 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61  ails, the databa
24fc0 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  se should.** be 
24fd0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
24fe0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
24ff0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61  ce_nonroot(MemPa
25000 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
25010 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20  mPage *pParent; 
25020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25030 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
25040 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
25050 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
25060 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
25070 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
25080 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20  nt nCell = 0;   
25090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
250a0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
250b0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
250c0 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  int nMaxCells = 
250d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
250e0 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
250f0 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  f apCell, szCell
25100 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e  , aFrom. */.  in
25110 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  t nOld;         
25120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25130 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
25140 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e   apOld[] */.  in
25150 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
25160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25170 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
25180 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
25190 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20  t nDiv;         
251a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
251b0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
251c0 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e   apDiv[] */.  in
251d0 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20  t i, j, k;      
251e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
251f0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
25200 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25220 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20   Index of pPage 
25230 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
25240 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  l[] */.  int nxD
25250 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
25260 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
25270 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
25280 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
25290 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
252c0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  ode */.  int lea
252d0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
252e0 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
252f0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
25300 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
25310 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
25320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25330 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
25340 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
25350 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
25360 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
25370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
25380 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
25390 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
253a0 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
253b0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
253c0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
253d0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
253e0 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25400 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
25410 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
25420 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
25430 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
25440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
25450 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
25460 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
25470 20 20 69 6e 74 20 69 53 70 61 63 65 32 20 3d 20    int iSpace2 = 
25480 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
25490 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
254a0 79 74 65 20 6f 66 20 61 53 70 61 63 65 32 5b 5d  yte of aSpace2[]
254b0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
254c0 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
254d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
254e0 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
254f0 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
25500 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
25510 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
25520 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
25530 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67  siblings */.  Pg
25540 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20  no pgnoOld[NB]; 
25550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
25560 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
25570 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c  ach page in apOl
25580 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  d[] */.  MemPage
25590 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
255a0 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
255b0 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
255c0 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
255d0 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
255e0 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
255f0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
25600 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
25610 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50  balancing */.  P
25620 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32  gno pgnoNew[NB+2
25630 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ];          /* P
25640 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
25650 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e  each page in apN
25660 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70  ew[] */.  u8 *ap
25670 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Div[NB];        
25680 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
25690 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
256a0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
256b0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
256c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
256d0 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
256e0 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
256f0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
25700 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
25710 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
25720 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
25730 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
25740 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
25750 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
25760 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
25770 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
25780 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257a0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
257b0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
257c0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
257d0 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  aCopy[NB];      
257e0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
257f0 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20  holding data of 
25800 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38  apCopy[] */.  u8
25810 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
25820 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
25830 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  r copies of divi
25840 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f 72  ders cells befor
25850 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75  e balance */.  u
25860 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30 3b 20  8 *aSpace2 = 0; 
25870 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
25880 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69 76 69  or overflow divi
25890 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74 65 72  ders cells after
258a0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 23 69 66 6e   balance */.#ifn
258b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
258c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20  AUTOVACUUM.  u8 
258d0 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64  *aFrom = 0;.#end
258e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  if..  assert( sq
258f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25900 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
25910 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ex) );..  /* .  
25920 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65  ** Find the pare
25930 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  nt page..  */.  
25940 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
25950 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
25960 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
25970 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
25980 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20 70 50  ->pDbPage) || pP
25990 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
259a0 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  1 );.  pBt = pPa
259b0 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65  ge->pBt;.  pPare
259c0 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
259d0 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
259e0 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20  Parent );.  if( 
259f0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
25a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25a10 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  te(pParent->pDbP
25a20 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74  age)) ){.    ret
25a30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52  urn rc;.  }.  TR
25a40 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
25a50 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
25a60 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
25a70 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
25a80 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e  t->pgno));..#ifn
25a90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25aa0 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f  QUICKBALANCE.  /
25ab0 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c  *.  ** A special
25ac0 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77   case:  If a new
25ad0 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20   entry has just 
25ae0 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
25af0 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20  to a.  ** table 
25b00 28 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65  (that is, a btre
25b10 65 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b  e with integer k
25b20 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  eys and all data
25b30 20 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a   at the leaves).
25b40 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77    ** and the new
25b50 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69   entry is the ri
25b60 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
25b70 6e 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68  n the tree (it h
25b80 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67  as the.  ** larg
25b90 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73  est key) then us
25ba0 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61  e the special ba
25bb0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f  lance_quick() ro
25bc0 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62  utine for.  ** b
25bd0 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e  alancing.  balan
25be0 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75  ce_quick() is mu
25bf0 63 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65  ch faster and re
25c00 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74  sults in a tight
25c10 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20  er.  ** packing 
25c20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63  of data in the c
25c30 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f  ommon case..  */
25c40 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
25c50 61 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  af &&.      pPag
25c60 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20  e->intKey &&.   
25c70 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
25c80 74 61 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ta &&.      pPag
25c90 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
25ca0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
25cb0 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50  aOvfl[0].idx==pP
25cc0 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20  age->nCell &&.  
25cd0 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
25ce0 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20  nt->pgno!=1 &&. 
25cf0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
25d00 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
25d10 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
25d20 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  +8])==pPage->pgn
25d30 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  o.  ){.    /*.  
25d40 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    ** TODO: Check
25d50 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f   the siblings to
25d60 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61   the left of pPa
25d70 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68  ge. It may be th
25d80 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61  at.    ** they a
25d90 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20  re not full and 
25da0 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72  no new page is r
25db0 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
25dc0 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e      return balan
25dd0 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20  ce_quick(pPage, 
25de0 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65  pParent);.  }.#e
25df0 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49  ndif..  if( SQLI
25e00 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
25e10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
25e20 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20  Page->pDbPage)) 
25e30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
25e40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
25e50 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69   Find the cell i
25e60 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
25e70 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69  e whose left chi
25e80 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20  ld points back. 
25e90 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54   ** to pPage.  T
25ea0 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62 6c  he "idx" variabl
25eb0 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  e is the index o
25ec0 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66  f that cell.  If
25ed0 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74   pPage.  ** is t
25ee0 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69  he rightmost chi
25ef0 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68  ld of pParent th
25f00 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70 50  en set idx to pP
25f10 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20  arent->nCell .  
25f20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
25f30 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20  ->idxShift ){.  
25f40 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
25f50 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
25f60 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
25f70 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61   pgno==sqlite3Pa
25f80 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
25f90 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
25fa0 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20  .    for(idx=0; 
25fb0 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  idx<pParent->nCe
25fc0 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20  ll; idx++){.    
25fd0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 66    if( get4byte(f
25fe0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
25ff0 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a   idx))==pgno ){.
26000 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26020 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
26030 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20  rent->nCell.    
26040 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34           || get4
26050 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
26060 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
26070 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e  rOffset+8])==pgn
26080 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o );.  }else{.  
26090 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69    idx = pPage->i
260a0 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20  dxParent;.  }.. 
260b0 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c   /*.  ** Initial
260c0 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ize variables so
260d0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
260e0 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20   safe to jump.  
260f0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62  ** directly to b
26100 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61  alance_cleanup a
26110 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20  t any moment..  
26120 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77  */.  nOld = nNew
26130 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
26140 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
26150 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  >pDbPage);..  /*
26160 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69  .  ** Find sibli
26170 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67  ng pages to pPag
26180 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20  e and the cells 
26190 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20  in pParent that 
261a0 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20  divide.  ** the 
261b0 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74  siblings.  An at
261c0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
261d0 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
261e0 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a  s on either.  **
261f0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
26200 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
26210 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
26220 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
26230 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74   if.  ** pPage t
26240 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74  here are fewer t
26250 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  han NN siblings 
26260 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
26270 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20  e.  If pParent. 
26280 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
26290 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
262a0 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
262b0 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
262c0 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69  ken..  */.  nxDi
262d0 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20  v = idx - NN;.  
262e0 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e  if( nxDiv + NB >
262f0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
26300 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70  ){.    nxDiv = p
26310 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20  Parent->nCell - 
26320 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66  NB + 1;.  }.  if
26330 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20  ( nxDiv<0 ){.   
26340 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a   nxDiv = 0;.  }.
26350 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f    nDiv = 0;.  fo
26360 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20  r(i=0, k=nxDiv; 
26370 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b  i<NB; i++, k++){
26380 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65  .    if( k<pPare
26390 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
263a0 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
263b0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
263c0 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b  k);.      nDiv++
263d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
263e0 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29  !pParent->leaf )
263f0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  ;.      pgnoOld[
26400 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  i] = get4byte(ap
26410 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c  Div[i]);.    }el
26420 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e  se if( k==pParen
26430 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
26440 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
26450 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
26460 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
26470 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
26480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26490 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
264a0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
264b0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f  tPage(pBt, pgnoO
264c0 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d  ld[i], &apOld[i]
264d0 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , pParent);.    
264e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
264f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
26500 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78     apOld[i]->idx
26510 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20  Parent = k;.    
26520 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20  apCopy[i] = 0;. 
26530 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f     assert( i==nO
26540 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b  ld );.    nOld++
26550 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  ;.    nMaxCells 
26560 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
26570 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
26580 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20  Overflow;.  }.. 
26590 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
265a0 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
265b0 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   4 in order to p
265c0 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
265d0 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
265e0 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
265f0 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e  nMaxCells + 3)&~
26600 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  3;..  /*.  ** Al
26610 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
26620 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
26630 65 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72 61  es.  */.  szScra
26640 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
26650 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
26660 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
26670 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
26680 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
26690 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
266a0 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
266b0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
266c0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f  ll */.     + (RO
266d0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
266e0 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67 65 53  age))+pBt->pageS
266f0 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70  ize)*NB  /* aCop
26700 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d  y */.     + pBt-
26710 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20  >pageSize       
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26730 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
26740 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53  e1 */.     + (IS
26750 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61  AUTOVACUUM ? nMa
26760 78 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20 20  xCells : 0);    
26770 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f           /* aFro
26780 6d 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  m */.  apCell = 
26790 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
267a0 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
267b0 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
267c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
267d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
267e0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
267f0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
26800 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
26810 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
26820 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75  .  aCopy[0] = (u
26830 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
26840 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
26850 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75   ((aCopy[0] - (u
26860 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
26870 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
26880 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
26890 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  ed */.  for(i=1;
268a0 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<NB; i++){.   
268b0 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f   aCopy[i] = &aCo
268c0 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  py[i-1][pBt->pag
268d0 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
268e0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
268f0 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43      assert( ((aC
26900 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70  opy[i] - (u8*)ap
26910 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
26920 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
26930 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
26940 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 31 20 3d  .  }.  aSpace1 =
26950 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42   &aCopy[NB-1][pB
26960 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
26970 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
26980 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e))];.  assert( 
26990 28 28 61 53 70 61 63 65 31 20 2d 20 28 75 38 2a  ((aSpace1 - (u8*
269a0 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30  )apCell) & 7)==0
269b0 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c   ); /* 8-byte al
269c0 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64  ignment required
269d0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
269e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
269f0 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  UM.  if( pBt->au
26a00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
26a10 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 31  aFrom = &aSpace1
26a20 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  [pBt->pageSize];
26a30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 53  .  }.#endif.  aS
26a40 70 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50  pace2 = sqlite3P
26a50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70  ageMalloc(pBt->p
26a60 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
26a70 61 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20  aSpace2==0 ){.  
26a80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
26a90 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
26aa0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
26ab0 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
26ac0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
26ad0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50  he content of pP
26ae0 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
26af0 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d  ings into aOld[]
26b00 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20  ..  ** The rest 
26b10 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
26b20 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
26b30 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
26b40 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ather.  ** that 
26b50 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
26b60 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
26b70 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
26b80 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20   be in the.  ** 
26b90 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
26ba0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20   overwritten..  
26bb0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
26bc0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
26bd0 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43  MemPage *p = apC
26be0 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
26bf0 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20  e*)aCopy[i];.   
26c00 20 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64   memcpy(p, apOld
26c10 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
26c20 61 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44  age));.    p->aD
26c30 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b  ata = (void*)&p[
26c40 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
26c50 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
26c60 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
26c70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
26c80 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
26c90 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
26ca0 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
26cb0 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
26cc0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
26cd0 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
26ce0 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
26cf0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
26d00 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
26d10 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
26d20 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61   obtained form a
26d30 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d  Space1[] and rem
26d40 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69  ove the the divi
26d50 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66  der Cells.  ** f
26d60 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
26d70 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
26d80 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
26d90 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
26da0 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
26db0 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
26dc0 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
26dd0 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
26de0 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
26df0 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
26e00 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31   ** into aSpace1
26e10 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
26e20 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
26e30 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
26e40 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
26e50 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
26e60 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
26e70 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
26e80 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
26e90 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
26ea0 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
26eb0 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
26ec0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
26ed0 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
26ee0 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
26ef0 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
26f00 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
26f10 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
26f20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
26f30 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
26f40 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
26f50 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
26f60 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
26f70 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
26f80 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61  nCell = 0;.  lea
26f90 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50  fCorrection = pP
26fa0 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  age->leaf*4;.  l
26fb0 65 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d  eafData = pPage-
26fc0 3e 6c 65 61 66 44 61 74 61 20 26 26 20 70 50 61  >leafData && pPa
26fd0 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28  ge->leaf;.  for(
26fe0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
26ff0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
27000 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
27010 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20  ;.    int limit 
27020 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
27030 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
27040 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
27050 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
27060 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
27070 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
27080 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
27090 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
270a0 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20  ll(pOld, j);.   
270b0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
270c0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
270d0 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c  Old, apCell[nCel
270e0 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  l]);.#ifndef SQL
270f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27100 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
27110 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
27120 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a  .        int a;.
27130 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
27140 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  ell] = i;.      
27150 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c    for(a=0; a<pOl
27160 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b  d->nOverflow; a+
27170 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
27180 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d  ( pOld->aOvfl[a]
27190 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e  .pCell==apCell[n
271a0 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  Cell] ){.       
271b0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
271c0 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
271d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
271e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
271f0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
27200 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  f.      nCell++;
27210 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
27220 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20  <nOld-1 ){.     
27230 20 75 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69   u16 sz = cellSi
27240 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
27250 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
27260 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
27270 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20          /* With 
27280 74 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61  the LEAFDATA fla
27290 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73  g, pParent cells
272a0 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45   hold only INTKE
272b0 59 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  Ys that.        
272c0 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ** are duplicate
272d0 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65  s of keys on the
272e0 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57   child pages.  W
272f0 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65  e need to remove
27300 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
27310 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
27320 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20  om pParent, but 
27330 74 68 65 20 64 69 76 69 64 65 72 73 20 63 65 6c  the dividers cel
27340 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20  ls are not.     
27350 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61     ** added to a
27360 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20  pCell[] because 
27370 74 68 65 79 20 61 72 65 20 64 75 70 6c 69 63 61  they are duplica
27380 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c  tes of child cel
27390 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ls..        */. 
273a0 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
273b0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
273c0 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sz);.      }else
273d0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 54  {.        u8 *pT
273e0 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  emp;.        ass
273f0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
27400 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20  ells );.        
27410 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
27420 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  sz;.        pTem
27430 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70  p = &aSpace1[iSp
27440 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  ace1];.        i
27450 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20  Space1 += sz;.  
27460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
27470 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
27480 34 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  4 );.        ass
27490 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42  ert( iSpace1<=pB
274a0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
274b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
274c0 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  emp, apDiv[i], s
274d0 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65  z);.        apCe
274e0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d  ll[nCell] = pTem
274f0 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  p+leafCorrection
27500 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
27510 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
27520 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
27530 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
27540 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b            aFrom[
27550 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20  nCell] = 0xFF;. 
27560 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
27570 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
27580 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
27590 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a   sz);.        sz
275a0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c  Cell[nCell] -= l
275b0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
275c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67         assert( g
275d0 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d  et4byte(pTemp)==
275e0 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20  pgnoOld[i] );.  
275f0 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
27600 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
27610 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
27620 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
27630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27640 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
27650 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
27660 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
27670 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20  e left.         
27680 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
27690 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
276a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
276b0 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
276c0 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
276d0 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  pOld->hdrOffset+
276e0 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  8], 4);.        
276f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27700 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
27710 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
27720 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
27730 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20  ll[nCell]<4 ){. 
27740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
27750 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
27760 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
27770 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
27780 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
27790 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
277a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
277b0 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c   }.        nCell
277c0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
277d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
277e0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
277f0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
27800 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
27810 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
27820 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
27830 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
27840 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
27850 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
27860 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
27870 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
27880 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
27890 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
278a0 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
278b0 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
278c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
278d0 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
278e0 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
278f0 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
27900 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
27910 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
27920 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
27930 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
27940 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
27950 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
27960 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
27970 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
27980 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
27990 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
279a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
279b0 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
279c0 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
279d0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
279e0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
279f0 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
27a00 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
27a10 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
27a20 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
27a30 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
27a40 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
27a50 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
27a60 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
27a70 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
27a80 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
27a90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
27aa0 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
27ab0 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
27ac0 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
27ad0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
27ae0 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
27af0 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
27b00 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
27b10 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
27b20 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
27b30 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
27b40 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
27b50 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
27b60 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
27b70 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
27b80 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
27b90 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
27ba0 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
27bb0 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
27bc0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
27bd0 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
27be0 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
27bf0 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
27c00 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
27c10 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
27c20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
27c30 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
27c40 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
27c50 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
27c60 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
27c70 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
27c80 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
27c90 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
27ca0 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
27cb0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
27cc0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
27cd0 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
27ce0 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
27cf0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
27d00 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
27d10 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
27d20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
27d30 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
27d40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
27d50 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
27d60 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
27d70 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
27d80 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
27d90 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
27da0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
27db0 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
27dc0 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
27dd0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
27de0 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
27df0 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
27e00 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
27e10 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
27e20 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
27e30 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
27e40 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
27e50 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
27e60 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
27e70 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
27e80 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
27e90 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27eb0 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
27ec0 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
27ed0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
27ee0 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
27ef0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
27f00 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
27f10 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
27f20 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
27f30 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
27f40 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
27f50 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
27f60 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
27f70 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
27f80 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
27f90 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
27fa0 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
27fb0 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
27fc0 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
27fd0 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
27fe0 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
27ff0 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
28000 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
28010 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
28020 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
28030 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
28040 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
28050 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
28060 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
28070 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
28080 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
28090 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
280a0 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
280b0 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
280c0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
280d0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61  w[0])>0) or we a
280e0 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69  re the.  ** a vi
280f0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
28100 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
28110 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
28120 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
28130 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
28140 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
28150 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
28160 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
28170 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
28180 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
28190 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
281a0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
281b0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
281c0 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73  cate k new pages
281d0 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67  .  Reuse old pag
281e0 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  es where possibl
281f0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
28200 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
28210 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d  );.  pageFlags =
28220 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
28230 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
28240 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
28250 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
28260 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
28270 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
28280 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
28290 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
282a0 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20  = pgnoOld[i];.  
282b0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
282c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
282d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
282e0 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
282f0 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
28300 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
28310 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
28320 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28330 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
28340 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
28350 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
28360 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
28370 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b  New[i], pgnoNew[
28380 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  i-1], 0);.      
28390 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
283a0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
283b0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
283c0 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
283d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 65  ++;.    }.    ze
283e0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
283f0 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  eFlags);.  }..  
28400 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20  /* Free any old 
28410 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
28420 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65  not reused as ne
28430 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
28440 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b  while( i<nOld ){
28450 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
28460 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
28470 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28480 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
28490 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
284a0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
284b0 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
284c0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
284d0 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65  .  ** Put the ne
284e0 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  w pages in accen
284f0 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69  ding order.  Thi
28500 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20  s helps to.  ** 
28510 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20  keep entries in 
28520 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e  the disk file in
28530 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61   order so that a
28540 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68   scan.  ** of th
28550 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e  e table is a lin
28560 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
28570 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74   the file.  That
28580 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65  .  ** in turn he
28590 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e  lps the operatin
285a0 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69  g system to deli
285b0 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66  ver pages.  ** f
285c0 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72  rom the disk mor
285d0 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a  e rapidly..  **.
285e0 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69    ** An O(n^2) i
285f0 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c  nsertion sort al
28600 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c  gorithm is used,
28610 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20   but since.  ** 
28620 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  n is never more 
28630 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c  than NB (a small
28640 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74   constant), that
28650 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74   should.  ** not
28660 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20   be a problem.. 
28670 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42   **.  ** When NB
28680 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70  ==3, this one op
28690 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73  timization makes
286a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
286b0 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73  ** about 25% fas
286c0 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e  ter for large in
286d0 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c  sertions and del
286e0 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  etions..  */.  f
286f0 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69  or(i=0; i<k-1; i
28700 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  ++){.    int min
28710 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  V = pgnoNew[i];.
28720 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
28730 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
28740 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
28750 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d    if( pgnoNew[j]
28760 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
28770 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
28780 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
28790 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a  V = pgnoNew[j];.
287a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
287b0 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a    if( minI>i ){.
287c0 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20        int t;.   
287d0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a     MemPage *pT;.
287e0 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65        t = pgnoNe
287f0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d  w[i];.      pT =
28800 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
28810 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
28820 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  noNew[minI];.   
28830 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
28840 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
28850 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d   pgnoNew[minI] =
28860 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b   t;.      apNew[
28870 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
28880 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
28890 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
288a0 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28   %d %d  new: %d(
288b0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
288c0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
288d0 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  n",.    pgnoOld[
288e0 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  0], .    nOld>=2
288f0 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20   ? pgnoOld[1] : 
28900 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
28910 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c   pgnoOld[2] : 0,
28920 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c  .    pgnoNew[0],
28930 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
28940 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77  New>=2 ? pgnoNew
28950 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  [1] : 0, nNew>=2
28960 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
28970 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70  .    nNew>=3 ? p
28980 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e  gnoNew[2] : 0, n
28990 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
289a0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
289b0 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20  =4 ? pgnoNew[3] 
289c0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
289d0 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
289e0 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e   nNew>=5 ? pgnoN
289f0 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[4] : 0, nNew>
28a00 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
28a10 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  0));..  /*.  ** 
28a20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
28a30 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
28a40 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
28a50 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
28a60 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
28a70 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
28a80 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
28a90 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
28aa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
28ab0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
28ac0 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
28ad0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
28ae0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
28af0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
28b00 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
28b10 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
28b20 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e  ssert( pNew->pgn
28b30 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b  o==pgnoNew[i] );
28b40 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
28b50 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
28b60 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
28b70 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
28b80 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
28b90 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
28ba0 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
28bb0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
28bc0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
28bd0 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64  low==0 );..#ifnd
28be0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
28bf0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a  UTOVACUUM.    /*
28c00 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
28c10 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
28c20 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
28c30 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
28c40 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ies.    ** that 
28c50 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62  point to the sib
28c60 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20  lings that were 
28c70 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73  rearranged. Thes
28c80 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20  e can be: left. 
28c90 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f     ** children o
28ca0 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67  f cells, the rig
28cb0 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ht-child of the 
28cc0 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f  page, or overflo
28cd0 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70  w pages.    ** p
28ce0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c  ointed to by cel
28cf0 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ls..    */.    i
28d00 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
28d10 75 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  um ){.      for(
28d20 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d  k=j; k<cntNew[i]
28d30 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
28d40 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65  assert( k<nMaxCe
28d50 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69  lls );.        i
28d60 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46  f( aFrom[k]==0xF
28d70 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
28d80 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[k]]->pgno!=pNe
28d90 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  w->pgno ){.     
28da0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
28db0 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d  PutOvfl(pNew, k-
28dc0 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
28dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
28df0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
28e00 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nup;.          }
28e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28e20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
28e30 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
28e40 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
28e50 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
28e60 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
28e70 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
28e80 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
28e90 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
28ea0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
28eb0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
28ec0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
28ed0 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c  ( i<nNew-1 && j<
28ee0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
28ef0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
28f00 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
28f10 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
28f20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
28f30 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
28f40 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
28f50 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
28f60 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
28f70 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
28f80 6d 70 20 3d 20 26 61 53 70 61 63 65 32 5b 69 53  mp = &aSpace2[iS
28f90 70 61 63 65 32 5d 3b 0a 20 20 20 20 20 20 69 66  pace2];.      if
28fa0 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
28fb0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
28fc0 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
28fd0 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
28fe0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
28ff0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
29000 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
29010 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
29020 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
29030 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
29040 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
29050 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
29060 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
29070 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
29080 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
29090 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
290a0 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
290b0 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
290c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
290d0 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
290e0 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
290f0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
29100 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
29110 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
29120 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
29130 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73    j--;.        s
29140 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
29150 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
29160 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
29170 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
29180 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   pTemp;.        
29190 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
291a0 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e  nt, pCell, 0, in
291b0 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30  fo.nKey, 0, 0, 0
291c0 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  , &sz);.        
291d0 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
291e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
291f0 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
29200 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63      /* Obscure c
29210 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66  ase for non-leaf
29220 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20  -data trees: If 
29230 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c  the cell at pCel
29240 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a  l was.        **
29250 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72   previously stor
29260 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64  ed on a leaf nod
29270 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72  e, and its repor
29280 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20  ted size was 4. 
29290 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c         ** bytes,
292a0 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74   then it may act
292b0 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72  ually be smaller
292c0 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20   than this .    
292d0 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69      ** (see sqli
292e0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
292f0 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20  lPtr(), 4 bytes 
29300 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73  is the minimum s
29310 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ize of.        *
29320 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74  * any cell). But
29330 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
29340 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72   to pass the cor
29350 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20  rect size to .  
29360 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43        ** insertC
29370 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73  ell(), so repars
29380 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a  e the cell now..
29390 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
293a0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
293b0 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68  this can never h
293c0 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69  appen in an SQLi
293d0 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73  te data file, as
293e0 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
293f0 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61  cells are at lea
29400 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f  st 4 bytes. It o
29410 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62  nly happens in b
29420 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20  -trees used.    
29430 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61      ** to evalua
29440 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e  te "IN (SELECT .
29450 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72  ..)" and similar
29460 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
29470 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
29480 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b   szCell[j]==4 ){
29490 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
294a0 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t(leafCorrection
294b0 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==4);.          
294c0 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
294d0 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29  (pParent, pCell)
294e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
294f0 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61 63 65    }.      iSpace
29500 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  2 += sz;.      a
29510 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
29520 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
29530 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
29540 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce2<=pBt->pageSi
29550 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ze );.      rc =
29560 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
29570 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
29580 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29  l, sz, pTemp, 4)
29590 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
295a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
295b0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
295c0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
295d0 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
295e0 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
295f0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23  , pNew->pgno);.#
29600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29610 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
29620 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
29630 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
29640 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e   database, and n
29650 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  ot a leaf-data t
29660 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ree,.      ** th
29670 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  en update the po
29680 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61  inter map with a
29690 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
296a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
296b0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
296c0 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74  cell just insert
296d0 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66  ed points to (if
296e0 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
296f0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
29700 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65  utoVacuum && !le
29710 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
29720 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29730 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
29740 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
29750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
29770 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29780 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
29790 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
297a0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
297b0 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iv++;.    }.  }.
297c0 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
297d0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
297e0 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
297f0 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
29800 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
29810 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
29820 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
29830 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
29840 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f  a[8], &apCopy[nO
29850 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ld-1]->aData[8],
29860 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   4);.  }.  if( n
29870 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  xDiv==pParent->n
29880 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f  Cell+pParent->nO
29890 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f  verflow ){.    /
298a0 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
298b0 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68  ling is the righ
298c0 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  t-most child of 
298d0 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70  pParent */.    p
298e0 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
298f0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
29900 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
29910 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
29920 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
29930 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
29940 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20  ing is the left 
29950 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72  child of the fir
29960 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72  st entry in pPar
29970 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  ent.    ** past 
29980 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64  the right-most d
29990 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a  ivider entry */.
299a0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
299b0 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
299c0 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70  arent, nxDiv), p
299d0 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
299e0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
299f0 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65  Reparent childre
29a00 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a  n of all cells..
29a10 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
29a20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
29a30 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
29a40 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b  hildPages(apNew[
29a50 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
29a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
29a70 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29a80 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65  p;.  }.  rc = re
29a90 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
29aa0 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  (pParent);.  if(
29ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29ac0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
29ad0 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  eanup;..  /*.  *
29ae0 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61  * Balance the pa
29af0 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65  rent page.  Note
29b00 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
29b10 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d  t page (pPage) m
29b20 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62  ight.  ** have b
29b30 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  een added to the
29b40 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20   freelist so it 
29b50 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  might no longer 
29b60 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
29b70 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72    ** But the par
29b80 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c  ent page will al
29b90 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69  ways be initiali
29ba0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  zed..  */.  asse
29bb0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
29bc0 6e 69 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  nit );.  sqlite3
29bd0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
29be0 6c 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ll);.  apCell = 
29bf0 30 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  0;.  rc = balanc
29c00 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  e(pParent, 0);. 
29c10 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61   .  /*.  ** Clea
29c20 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
29c30 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
29c40 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
29c50 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 61 53  lite3PageFree(aS
29c60 70 61 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65  pace2);.  sqlite
29c70 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
29c80 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
29c90 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
29ca0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
29cb0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
29cc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
29cd0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
29ce0 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
29cf0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
29d00 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
29d10 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
29d20 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25   finished with %
29d30 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
29d40 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
29d50 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
29d60 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c  gno, nOld, nNew,
29d70 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75   nCell));.  retu
29d80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29d90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
29da0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72  called for the r
29db0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74  oot page of a bt
29dc0 72 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  ree when the roo
29dd0 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  t.** page contai
29de0 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68  ns no cells.  Th
29df0 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75  is is an opportu
29e00 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65  nity to make the
29e10 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77   tree.** shallow
29e20 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e  er by one level.
29e30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
29e40 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
29e50 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
29e60 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  {.  MemPage *pCh
29e70 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
29e80 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69   /* The only chi
29e90 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65  ld page of pPage
29ea0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
29eb0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
29ec0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
29ed0 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a  r for pChild */.
29ee0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29ef0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
29f00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
29f10 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
29f20 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
29f30 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
29f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
29f50 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72  n BTree structur
29f60 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c  e */.  int mxCel
29f70 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20  lPerPage;       
29f80 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
29f90 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70  umber of cells p
29fa0 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  er page */.  u8 
29fb0 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
29fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
29fd0 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65   cells from page
29fe0 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
29ff0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
2a000 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2a010 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
2a020 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
2a030 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2a040 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b  e->pParent==0 );
2a050 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a060 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2a070 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a080 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2a090 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2a0a0 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
2a0b0 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72  pBt;.  mxCellPer
2a0c0 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70  Page = MX_CELL(p
2a0d0 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20  Bt);.  apCell = 
2a0e0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d  sqlite3Malloc( m
2a0f0 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69  xCellPerPage*(si
2a100 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66  zeof(u8*)+sizeof
2a110 28 75 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20  (u16)) );.  if( 
2a120 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  apCell==0 ) retu
2a130 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2a140 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
2a150 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c  *)&apCell[mxCell
2a160 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  PerPage];.  if( 
2a170 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2a180 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2a190 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  is completely em
2a1a0 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45  pty */.    TRACE
2a1b0 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74  (("BALANCE: empt
2a1c0 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70  y table %d\n", p
2a1d0 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2a1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2a1f0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2a200 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65  mpty but has one
2a210 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65   child.  Transfe
2a220 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66  r the.    ** inf
2a230 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2a240 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74  at one child int
2a250 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2a260 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  if it .    ** wi
2a270 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65  ll fit.  This re
2a280 64 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20  duces the depth 
2a290 6f 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f  of the tree by o
2a2a0 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
2a2b0 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * If the root pa
2a2c0 67 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74  ge is page 1, it
2a2d0 20 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20   has less space 
2a2e0 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20  available than. 
2a2f0 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20     ** its child 
2a300 28 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20  (due to the 100 
2a310 62 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74  byte header that
2a320 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62   occurs at the b
2a330 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eginning.    ** 
2a340 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2a350 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68  fle), so it migh
2a360 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  t not be able to
2a370 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65   hold all of the
2a380 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61   .    ** informa
2a390 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63  tion currently c
2a3a0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
2a3b0 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20  child.  If this 
2a3c0 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  is the .    ** c
2a3d0 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ase, then do not
2a3e0 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72   do the transfer
2a3f0 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20  .  Leave page 1 
2a400 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20  empty except.   
2a410 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68   ** for the righ
2a420 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  t-pointer to the
2a430 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
2a440 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63  e child page bec
2a450 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  omes.    ** the 
2a460 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
2a470 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f  the tree..    */
2a480 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d  .    pgnoChild =
2a490 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2a4a0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2a4b0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2a4c0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68    assert( pgnoCh
2a4d0 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ild>0 );.    ass
2a4e0 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d  ert( pgnoChild<=
2a4f0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2a500 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
2a510 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r) );.    rc = s
2a520 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2a530 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ge(pPage->pBt, p
2a540 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c  gnoChild, &pChil
2a550 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 0);.    if( r
2a560 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
2a570 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
2a580 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e    if( pPage->pgn
2a590 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  o==1 ){.      rc
2a5a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2a5b0 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
2a5c0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
2a5d0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2a5e0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2a5f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a600 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2a610 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2a620 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d   pChild->nFree>=
2a630 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  100 ){.        /
2a640 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f  * The child info
2a650 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74  rmation will fit
2a660 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
2a670 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20  e, so do the.   
2a680 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a       ** copy */.
2a690 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
2a6a0 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28         zeroPage(
2a6b0 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
2a6c0 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
2a6d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
2a6e0 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
2a6f0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65  {.          apCe
2a700 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  ll[i] = findCell
2a710 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20  (pChild,i);.    
2a720 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20        szCell[i] 
2a730 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43  = cellSizePtr(pC
2a740 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29  hild, apCell[i])
2a750 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a760 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2a770 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2a780 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73  nCell, apCell, s
2a790 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zCell);.        
2a7a0 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68  /* Copy the righ
2a7b0 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t-pointer of the
2a7c0 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61   child to the pa
2a7d0 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rent. */.       
2a7e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2a7f0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2a800 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
2a810 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
2a820 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
2a830 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
2a840 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2a850 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2a860 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  d);.        TRAC
2a870 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
2a880 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74  ld %d transfer t
2a890 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  o page 1\n", pCh
2a8a0 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2a8b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a8c0 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68    /* The child h
2a8d0 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  as more informat
2a8e0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ion that will fi
2a8f0 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20  t on the root.. 
2a900 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72         ** The tr
2a910 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61  ee is already ba
2a920 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68  lanced.  Do noth
2a930 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
2a940 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2a950 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e   child %d will n
2a960 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31  ot fit on page 1
2a970 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
2a980 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
2a990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2a9a0 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74  mcpy(pPage->aDat
2a9b0 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  a, pChild->aData
2a9c0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
2a9d0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
2a9e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2a9f0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
2aa00 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
2aa10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2aa20 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
2aa30 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  age, 0);.      a
2aa40 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2aa50 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72  E_OK );.      fr
2aa60 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
2aa70 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
2aa80 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20  LANCE: transfer 
2aa90 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f  child %d into ro
2aaa0 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot %d\n",.      
2aab0 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e          pChild->
2aac0 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e  pgno, pPage->pgn
2aad0 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
2aae0 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
2aaf0 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20  dPages(pPage);. 
2ab00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ab10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2ab20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2ab30 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2ab40 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2ab50 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2ab60 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
2ab70 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
2ab80 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20  >nCell; i++){ . 
2ab90 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2aba0 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c  apPutOvfl(pPage,
2abb0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
2abc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2abd0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2abe0 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
2abf0 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ance;.        }.
2ac00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2ac10 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65  ndif.    release
2ac20 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2ac30 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  }.end_shallow_ba
2ac40 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33  lance:.  sqlite3
2ac50 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  _free(apCell);. 
2ac60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2ac70 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  /*.** The root p
2ac80 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a  age is overfull.
2ac90 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2aca0 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20  happens, Create 
2acb0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2acc0 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a   and copy the.**
2acd0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2ace0 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63   root into the c
2acf0 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65  hild.  Then make
2ad00 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2ad10 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  e an empty page 
2ad20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20  with rightChild 
2ad30 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2ad40 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20  new.** child.   
2ad50 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61  Finally, call ba
2ad60 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29  lance_internal()
2ad70 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c   on the new chil
2ad80 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74  d.** to cause it
2ad90 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74   to split..*/.st
2ada0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2adb0 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
2adc0 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  *pPage){.  int r
2add0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
2ade0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
2adf0 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
2ae00 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
2ae10 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f  pChild;    /* Po
2ae20 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
2ae30 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
2ae40 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
2ae50 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2ae60 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
2ae70 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
2ae80 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2ae90 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
2aea0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
2aeb0 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
2aec0 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
2aed0 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
2aee0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2aef0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2af00 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2af10 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
2af20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2af30 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
2af40 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
2af50 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
2af60 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
2af70 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
2af80 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20  t */.  int brk; 
2af90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2afa0 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
2afb0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
2afc0 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
2afd0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
2afe0 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
2aff0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2b000 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74  rflow>0 );.  pBt
2b010 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2b020 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2b030 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2b040 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2b050 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2b060 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64  age(pBt, &pChild
2b070 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50  , &pgnoChild, pP
2b080 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  age->pgno, 0);. 
2b090 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b0a0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
2b0b0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2b0c0 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
2b0d0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61  DbPage) );.  usa
2b0e0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
2b0f0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
2b100 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2b110 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2b120 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 62 72  >hdrOffset;.  br
2b130 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
2b140 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64  ta[hdr+5]);.  cd
2b150 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44  ata = pChild->aD
2b160 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64  ata;.  memcpy(cd
2b170 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c  ata, &data[hdr],
2b180 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2b190 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  et+2*pPage->nCel
2b1a0 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79  l-hdr);.  memcpy
2b1b0 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64  (&cdata[brk], &d
2b1c0 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ata[brk], usable
2b1d0 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73  Size-brk);.  ass
2b1e0 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49  ert( pChild->isI
2b1f0 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  nit==0 );.  rc =
2b200 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2b210 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50  tPage(pChild, pP
2b220 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2b230 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
2b240 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70  per_out;.  memcp
2b250 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
2b260 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70   pPage->aOvfl, p
2b270 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Page->nOverflow*
2b280 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
2b290 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69  vfl[0]));.  pChi
2b2a0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
2b2b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2b2c0 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e  ;.  if( pChild->
2b2d0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
2b2e0 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d   pChild->nFree =
2b2f0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
2b300 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
2b310 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
2b320 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67  .  zeroPage(pPag
2b330 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
2b340 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
2b350 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2b360 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2b370 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2b380 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52  pgnoChild);.  TR
2b390 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
2b3a0 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
2b3b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2b3c0 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
2b3d0 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  o));.#ifndef SQL
2b3e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2b3f0 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
2b400 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2b410 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20 3d   int i;.    rc =
2b420 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2b430 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54  pChild->pgno, PT
2b440 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67  RMAP_BTREE, pPag
2b450 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  e->pgno);.    if
2b460 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2b470 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
2b480 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
2b490 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
2b4a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
2b4b0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68 69  rmapPutOvfl(pChi
2b4c0 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ld, i);.      if
2b4d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b4e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2b4f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2b500 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
2b510 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
2b520 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a 0a  nroot(pChild);..
2b530 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
2b540 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
2b550 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75  (pChild);.  retu
2b560 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b570 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70 61  Decide if the pa
2b580 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20 74  ge pPage needs t
2b590 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20 20  o be balanced.  
2b5a0 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a  If balancing is.
2b5b0 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61 6c  ** required, cal
2b5c0 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  l the appropriat
2b5d0 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  e balancing rout
2b5e0 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
2b5f0 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
2b600 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
2b610 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63  nsert){.  int rc
2b620 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b630 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2b640 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2b650 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2b660 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
2b670 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  arent==0 ){.    
2b680 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b690 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2b6a0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2b6b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b6c0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2b6d0 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  w>0 ){.      rc 
2b6e0 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
2b6f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
2b700 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b710 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
2b720 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
2b730 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68   rc = balance_sh
2b740 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a  allower(pPage);.
2b750 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b760 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
2b770 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20  verflow>0 || .  
2b780 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20 26        (!insert &
2b790 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70  & pPage->nFree>p
2b7a0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2b7b0 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20  eSize*2/3) ){.  
2b7c0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2b7d0 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b  _nonroot(pPage);
2b7e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2b7f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b800 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
2b810 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73  ecks all cursors
2b820 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
2b830 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  able pgnoRoot..*
2b840 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73  * If any of thos
2b850 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f  e cursors were o
2b860 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
2b870 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72  g==0 in a differ
2b880 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
2b890 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61  connection (a da
2b8a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2b8b0 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  n that shares th
2b8c0 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65  e pager.** cache
2b8d0 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
2b8e0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e  t connection) an
2b8f0 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e  d that other con
2b900 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e  nection .** is n
2b910 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e  ot in the ReadUn
2b920 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65  commmitted state
2b930 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
2b940 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ine returns .** 
2b950 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
2b960 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20  *.** As well as 
2b970 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46  cursors with wrF
2b980 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20  lag==0, cursors 
2b990 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 20 61  with wrFlag==1 a
2b9a0 6e 64 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f  nd .** isIncrblo
2b9b0 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61  bHandle==1 are a
2b9c0 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65 64 20 27  lso considered '
2b9d0 72 65 61 64 27 20 63 75 72 73 6f 72 73 2e 20 49  read' cursors. I
2b9e0 6e 63 72 65 6d 65 6e 74 61 6c 20 0a 2a 2a 20 62  ncremental .** b
2b9f0 6c 6f 62 20 63 75 72 73 6f 72 73 20 61 72 65 20  lob cursors are 
2ba00 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65  used for both re
2ba10 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
2ba20 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67  g..**.** When pg
2ba30 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f  noRoot is the ro
2ba40 6f 74 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e  ot page of an in
2ba50 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73  tkey table, this
2ba60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73   function is als
2ba70 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65  o.** responsible
2ba80 20 66 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e   for invalidatin
2ba90 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  g incremental bl
2baa0 6f 62 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20  ob cursors when 
2bab0 74 68 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a  the table row.**
2bac0 20 6f 6e 20 77 68 69 63 68 20 74 68 65 79 20 61   on which they a
2bad0 72 65 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c  re opened is del
2bae0 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64  eted or modified
2baf0 2e 20 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e  . Cursors are in
2bb00 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63  validated.** acc
2bb10 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f  ording to the fo
2bb20 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  llowing rules:.*
2bb30 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42  *.**   1) When B
2bb40 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
2bb50 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
2bb60 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20  mpletely delete 
2bb70 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
2bb80 20 20 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65       of a B-Tree
2bb90 20 74 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65   table, pExclude
2bba0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   is set to zero 
2bbb0 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52  and parameter iR
2bbc0 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73  ow is .**      s
2bbd0 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  et to non-zero. 
2bbe0 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
2bbf0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2bc00 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a  b cursors open.*
2bc10 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61  *      on the ta
2bc20 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67  ble rooted at pg
2bc30 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c  noRoot are inval
2bc40 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
2bc50 32 29 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73  2) When BtreeIns
2bc60 65 72 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65  ert(), BtreeDele
2bc70 74 65 28 29 20 6f 72 20 42 74 72 65 65 50 75 74  te() or BtreePut
2bc80 44 61 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64  Data() is called
2bc90 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64   to .**      mod
2bca0 69 66 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20  ify a table row 
2bcb0 76 69 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65  via an SQL state
2bcc0 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69  ment, pExclude i
2bcd0 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
2bce0 20 20 20 20 20 20 77 72 69 74 65 20 63 75 72 73        write curs
2bcf0 6f 72 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68  or used to do th
2bd00 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61  e modification a
2bd10 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f  nd parameter iRo
2bd20 77 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20  w is set.**     
2bd30 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20   to the integer 
2bd40 72 6f 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d  row id of the B-
2bd50 54 72 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67  Tree entry being
2bd60 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73   modified. Unles
2bd70 73 0a 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75  s.**      pExclu
2bd80 64 65 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20  de is itself an 
2bd90 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2bda0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c   cursor, then al
2bdb0 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  l incremental.**
2bdc0 20 20 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f        blob curso
2bdd0 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69  rs open on row i
2bde0 52 6f 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65  Row of the B-Tre
2bdf0 65 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  e are invalidate
2be00 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66  d..**.**   3) If
2be10 20 62 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61   both pExclude a
2be20 6e 64 20 69 52 6f 77 20 61 72 65 20 73 65 74 20  nd iRow are set 
2be30 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72  to zero, no incr
2be40 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a  emental blob .**
2be50 20 20 20 20 20 20 63 75 72 73 6f 72 73 20 61 72        cursors ar
2be60 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
2be70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
2be80 63 6b 52 65 61 64 4c 6f 63 6b 73 28 0a 20 20 42  ckReadLocks(.  B
2be90 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 0a 20  tree *pBtree, . 
2bea0 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
2beb0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
2bec0 63 6c 75 64 65 2c 0a 20 20 69 36 34 20 69 52 6f  clude,.  i64 iRo
2bed0 77 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  w.){.  BtCursor 
2bee0 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
2bef0 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
2bf00 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2bf10 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20   = pBtree->db;. 
2bf20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2bf30 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2bf40 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72  pBtree) );.  for
2bf50 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
2bf60 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
2bf70 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
2bf80 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
2bf90 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
2bfa0 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
2bfb0 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
2bfc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
2bfd0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20  NCRBLOB.    if( 
2bfe0 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
2bff0 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20  dle && ( .      
2c000 20 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26     (!pExclude &&
2c010 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20   iRow).      || 
2c020 28 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45  (pExclude && !pE
2c030 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c  xclude->isIncrbl
2c040 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69  obHandle && p->i
2c050 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a  nfo.nKey==iRow).
2c060 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d      )){.      p-
2c070 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2c080 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a  _INVALID;.    }.
2c090 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
2c0a0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2c0b0 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75  _VALID ) continu
2c0c0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72  e;.    if( p->wr
2c0d0 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66  Flag==0 .#ifndef
2c0e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2c0f0 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d  RBLOB.     || p-
2c100 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2c110 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  e.#endif.    ){.
2c120 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2c130 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72  bOther = p->pBtr
2c140 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 69 66  ee->db;.      if
2c150 28 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a  ( dbOther==0 ||.
2c160 20 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65           (dbOthe
2c170 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65  r!=db && (dbOthe
2c180 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  r->flags & SQLIT
2c190 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2c1a0 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  d)==0) ){.      
2c1b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c1c0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a  LOCKED;.      }.
2c1d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2c1e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2c1f0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2c200 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
2c210 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20  the BTree.  The 
2c220 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20  key is given by 
2c230 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61  (pKey,nKey).** a
2c240 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67  nd the data is g
2c250 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e  iven by (pData,n
2c260 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73  Data).  The curs
2c270 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  or is used only 
2c280 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61  to.** define wha
2c290 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f  t table the reco
2c2a0 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rd should be ins
2c2b0 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65  erted into.  The
2c2c0 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2c2d0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2c2e0 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2c2f0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49  ..**.** For an I
2c300 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c  NTKEY table, onl
2c310 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65  y the nKey value
2c320 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75   of the key is u
2c330 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
2c340 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61   ignored.  For a
2c350 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c   ZERODATA table,
2c360 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e   the pData and n
2c370 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67  Data are both ig
2c380 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
2c390 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
2c3a0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2c3b0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2c3c0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
2c3d0 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  a into the table
2c3e0 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   of this cursor 
2c3f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2c400 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2c410 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f      /* The key o
2c420 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2c430 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2c440 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
2c450 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ta,  /* The data
2c460 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
2c470 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  rd */.  int nZer
2c480 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
2c490 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c4a0 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65   of extra 0 byte
2c4b0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64  s to append to d
2c4c0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70  ata */.  int app
2c4d0 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20 20  endBias         
2c4e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c4f0 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c  if this is likel
2c500 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29  y an append */.)
2c510 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2c520 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e  t loc;.  int szN
2c530 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ew;.  MemPage *p
2c540 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
2c550 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
2c560 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2c570 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
2c580 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
2c590 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
2c5a0 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
2c5b0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
2c5c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2c5d0 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42  Cur) );.  if( pB
2c5e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2c5f0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2c600 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2c610 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2c620 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   before doing an
2c630 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72   insert */.    r
2c640 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
2c650 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2c660 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2c670 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  OR;.    return r
2c680 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2c690 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2c6a0 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e  );.  if( !pCur->
2c6b0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
2c6c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2c6d0 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f  ;   /* Cursor no
2c6e0 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  t open for writi
2c6f0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2c700 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2c710 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
2c720 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2c730 72 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20  r, nKey) ){.    
2c740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2c750 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2c760 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2c770 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2c780 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
2c790 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2c7a0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2c7b0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
2c7c0 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61  ip;.  }..  /* Sa
2c7d0 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2c7e0 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2c7f0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
2c800 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c  is table */.  cl
2c810 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2c820 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a  n(pCur);.  if( .
2c830 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
2c840 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2c850 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
2c860 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20  gnoRoot, pCur)) 
2c870 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ||.    SQLITE_OK
2c880 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
2c890 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
2c8a0 20 70 4b 65 79 2c 20 30 2c 20 6e 4b 65 79 2c 20   pKey, 0, nKey, 
2c8b0 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
2c8c0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
2c8d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50  rn rc;.  }..  pP
2c8e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2c8f0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
2c900 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b  ge->intKey || nK
2c910 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
2c920 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c  t( pPage->leaf |
2c930 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  | !pPage->leafDa
2c940 74 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ta );.  TRACE(("
2c950 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
2c960 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
2c970 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
2c980 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
2c990 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
2c9a0 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
2c9b0 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
2c9c0 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
2c9d0 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
2c9e0 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
2c9f0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2ca00 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  ;.  allocateTemp
2ca10 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65  Space(pBt);.  ne
2ca20 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d  wCell = pBt->pTm
2ca30 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65  pSpace;.  if( ne
2ca40 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  wCell==0 ) retur
2ca50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2ca60 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
2ca70 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  l(pPage, newCell
2ca80 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44  , pKey, nKey, pD
2ca90 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72  ata, nData, nZer
2caa0 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66  o, &szNew);.  if
2cab0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2cac0 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74  insert;.  assert
2cad0 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a  ( szNew==cellSiz
2cae0 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43  ePtr(pPage, newC
2caf0 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
2cb00 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c  ( szNew<=MX_CELL
2cb10 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
2cb20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55  if( loc==0 && CU
2cb30 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2cb40 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2cb50 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61  u16 szOld;.    a
2cb60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
2cb70 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
2cb80 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2cb90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2cba0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2cbb0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2cbc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2cbd0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2cbe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43  ;.    }.    oldC
2cbf0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2cc00 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2cc10 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
2cc20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2cc30 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20  memcpy(newCell, 
2cc40 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  oldCell, 4);.   
2cc50 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63   }.    szOld = c
2cc60 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2cc70 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
2cc80 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2cc90 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
2cca0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2ccb0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2ccc0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
2ccd0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f  , pCur->idx, szO
2cce0 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ld);.  }else if(
2ccf0 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
2cd00 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2cd10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
2cd20 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  eaf );.    pCur-
2cd30 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72  >idx++;.    pCur
2cd40 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2cd50 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
2cd60 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  dNKey = 0;.  }el
2cd70 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2cd80 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
2cd90 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74   }.  rc = insert
2cda0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2cdb0 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20  ->idx, newCell, 
2cdc0 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  szNew, 0, 0);.  
2cdd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cde0 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  K ) goto end_ins
2cdf0 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61  ert;.  rc = bala
2ce00 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20  nce(pPage, 1);. 
2ce10 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   /* sqlite3Btree
2ce20 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70  PageDump(pCur->p
2ce30 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2ce40 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20  ot, 1); */.  /* 
2ce50 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20  fflush(stdout); 
2ce60 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2ce70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
2ce80 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2ce90 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a    }.end_insert:.
2cea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ceb0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2cec0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2ced0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2cee0 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
2cef0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
2cf00 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
2cf10 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  om location..*/.
2cf20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2cf30 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
2cf40 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2cf50 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2cf60 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e  >pPage;.  unsign
2cf70 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2cf80 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
2cf90 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a   pgnoChild = 0;.
2cfa0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
2cfb0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
2cfc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2cfd0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2cfe0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2cff0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2d000 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2d010 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  t );.  if( pBt->
2d020 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2d030 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2d040 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2d050 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
2d060 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c  fore doing a del
2d070 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ete */.    rc = 
2d080 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2d090 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2d0a0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2d0b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d0c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2d0d0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
2d0e0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2d0f0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
2d100 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
2d110 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20  ur->skip;.  }.  
2d120 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2d130 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2d140 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d150 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2d160 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2d170 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2d180 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2d190 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2d1a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d1b0 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2d1c0 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2d1d0 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2d1e0 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2d1f0 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2d200 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2d210 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2d220 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  Cur, pCur->info.
2d230 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74  nKey) ){.    ret
2d240 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2d250 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
2d260 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
2d270 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
2d280 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  /.  }..  /* Rest
2d290 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2d2a0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
2d2b0 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20  (a no-op if the 
2d2c0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  cursor is not in
2d2d0 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45   .  ** CURSOR_RE
2d2e0 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29  QUIRESEEK state)
2d2f0 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f   and save the po
2d300 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
2d310 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20  ther cursors .  
2d320 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  ** open on the s
2d330 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20  ame table. Then 
2d340 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
2d350 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20  rWrite() on the 
2d360 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  page.  ** that t
2d370 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  he entry will be
2d380 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20   deleted from.. 
2d390 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
2d3a0 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
2d3b0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2d3c0 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  n(pCur))!=0 ||. 
2d3d0 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c     (rc = saveAll
2d3e0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
2d3f0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2d400 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
2d410 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d420 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2d430 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20  Page))!=0.  ){. 
2d440 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d450 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
2d460 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69  he cell within i
2d470 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  ts page and leav
2d480 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
2d490 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
2d4a0 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
2d4b0 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
2d4c0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2d4d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2d4e0 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
2d4f0 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
2d500 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
2d510 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20  .  */.  pCell = 
2d520 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2d530 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66  pCur->idx);.  if
2d540 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2d550 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
2d560 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
2d570 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
2d580 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
2d590 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
2d5a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2d5b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
2d5c0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d5d0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65   /*.    ** The e
2d5e0 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f 75  ntry we are abou
2d5f0 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e  t to delete is n
2d600 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20  ot a leaf so if 
2d610 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  we do not.    **
2d620 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   do something we
2d630 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f   will leave a ho
2d640 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61  le on an interna
2d650 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57  l page..    ** W
2d660 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74  e have to fill t
2d670 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e  he hole by movin
2d680 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d  g in a cell from
2d690 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20   a leaf.  The.  
2d6a0 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61    ** next Cell a
2d6b0 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20  fter the one to 
2d6c0 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67 75  be deleted is gu
2d6d0 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
2d6e0 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20  t and.    ** to 
2d6f0 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20  be a leaf so we 
2d700 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  can use it..    
2d710 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  */.    BtCursor 
2d720 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73  leafCur;.    uns
2d730 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78  igned char *pNex
2d740 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  t;.    int notUs
2d750 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ed;.    unsigned
2d760 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20   char *tempCell 
2d770 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2d780 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74   !pPage->leafDat
2d790 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
2d7a0 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
2d7b0 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
2d7c0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
2d7d0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
2d7e0 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
2d7f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2d800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d820 67 65 72 57 72 69 74 65 28 6c 65 61 66 43 75 72  gerWrite(leafCur
2d830 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  .pPage->pDbPage)
2d840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d860 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78  .      u16 szNex
2d870 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  t;.      TRACE((
2d880 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
2d890 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61  d delete interna
2d8a0 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63  l from %d replac
2d8b0 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
2d8c0 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72  ",.         pCur
2d8d0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
2d8e0 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72  e->pgno, leafCur
2d8f0 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a  .pPage->pgno));.
2d900 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
2d910 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2d920 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2d930 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2d940 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43     pNext = findC
2d950 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
2d960 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b  e, leafCur.idx);
2d970 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20  .      szNext = 
2d980 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66  cellSizePtr(leaf
2d990 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74  Cur.pPage, pNext
2d9a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2d9b0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
2d9c0 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a  t)>=szNext+4 );.
2d9d0 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65        allocateTe
2d9e0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
2d9f0 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70      tempCell = p
2da00 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
2da10 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c       if( tempCel
2da20 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
2da30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2da40 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
2da50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2da60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2da70 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2da80 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2da90 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b  pNext-4, szNext+
2daa0 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b  4, tempCell, 0);
2dab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2dac0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2dad0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
2dae0 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
2daf0 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  wCell(pPage, pCu
2db00 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69  r->idx), pgnoChi
2db10 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ld);.        rc 
2db20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2db30 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2db40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2db50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2db60 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72  dropCell(leafCur
2db70 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e  .pPage, leafCur.
2db80 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20  idx, szNext);.  
2db90 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2dba0 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ce(leafCur.pPage
2dbb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2dbc0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
2dbd0 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43  treeReleaseTempC
2dbe0 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b  ursor(&leafCur);
2dbf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52  .  }else{.    TR
2dc00 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
2dc10 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72  ble=%d delete fr
2dc20 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20  om leaf %d\n",. 
2dc30 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2dc40 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2dc50 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  o));.    dropCel
2dc60 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2dc70 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
2dc80 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
2dc90 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2dca0 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a  (pPage, 0);.  }.
2dcb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2dcc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
2dcd0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
2dce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dcf0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2dd00 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
2dd10 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2dd20 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
2dd30 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
2dd40 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2dd50 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
2dd60 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
2dd70 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
2dd80 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
2dd90 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
2dda0 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
2ddb0 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
2ddc0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
2ddd0 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
2dde0 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
2ddf0 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
2de00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
2de10 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
2de20 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
2de30 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
2de40 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
2de50 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
2de60 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
2de70 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
2de80 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
2de90 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
2dea0 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
2deb0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
2dec0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
2ded0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2dee0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
2def0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
2df00 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
2df10 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2df20 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2df30 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2df40 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2df50 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2df60 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2df70 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2df80 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a  action first */.
2df90 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2dfa0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2dfb0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2dfc0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2dfd0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2dfe0 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2dff0 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20  Only );..#ifdef 
2e000 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2e010 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
2e020 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2e030 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
2e040 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
2e050 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2e060 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2e070 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
2e080 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2e090 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
2e0a0 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
2e0b0 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
2e0c0 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
2e0d0 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
2e0e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
2e0f0 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
2e100 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
2e110 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61     /* Creating a
2e120 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70   new table may p
2e130 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20  robably require 
2e140 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69  moving an existi
2e150 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  ng database.    
2e160 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  ** to make room 
2e170 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
2e180 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e  es root page. In
2e190 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20   case this page 
2e1a0 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74  turns.    ** out
2e1b0 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c   to be an overfl
2e1c0 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20  ow page, delete 
2e1d0 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  all overflow pag
2e1e0 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20  e-map caches.   
2e1f0 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e   ** held by open
2e200 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f   cursors..    */
2e210 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
2e220 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
2e230 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  pBt);..    /* Re
2e240 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
2e250 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65  meta[3] from the
2e260 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74   database to det
2e270 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65  ermine where the
2e280 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
2e290 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
2e2a0 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65  le should go. me
2e2b0 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72  ta[3] is the lar
2e2c0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2e2d0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f     ** created so
2e2e0 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77   far, so the new
2e2f0 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d   root-page is (m
2e300 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a  eta[3]+1)..    *
2e310 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2e320 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2e330 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b  , 4, &pgnoRoot);
2e340 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2e350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e360 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2e370 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b  .    pgnoRoot++;
2e380 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  ..    /* The new
2e390 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e   root-page may n
2e3a0 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
2e3b0 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  on a pointer-map
2e3c0 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20   page, or the.  
2e3d0 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
2e3e0 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  E page..    */. 
2e3f0 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f     while( pgnoRo
2e400 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
2e410 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
2e420 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
2e430 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
2e440 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2e450 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
2e460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2e470 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
2e480 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
2e490 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
2e4a0 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
2e4b0 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
2e4c0 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
2e4d0 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
2e4e0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
2e4f0 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
2e500 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
2e510 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
2e520 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
2e530 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
2e540 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2e550 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
2e560 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
2e570 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
2e580 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2e590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e5a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2e5b0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
2e5c0 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
2e5d0 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
2e5e0 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
2e5f0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
2e600 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2e610 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
2e620 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
2e630 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
2e640 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
2e650 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
2e660 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
2e670 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
2e680 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
2e690 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
2e6a0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
2e6b0 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
2e6c0 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
2e6d0 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
2e6e0 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
2e6f0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
2e700 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
2e710 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
2e720 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
2e730 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
2e740 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
2e750 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
2e760 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
2e770 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
2e780 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
2e790 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2e7a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2e7b0 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2e7c0 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2e7d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e7e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e7f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2e800 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
2e810 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
2e820 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
2e830 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
2e840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e850 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
2e860 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
2e870 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2e880 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2e890 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2e8a0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2e8b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2e8c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2e8d0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
2e8e0 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
2e8f0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2e900 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
2e910 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2e920 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
2e930 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2e940 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2e950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e960 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2e970 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2e980 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2e990 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
2e9a0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
2e9b0 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
2e9c0 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b  Page, pgnoMove);
2e9d0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2e9e0 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20  ge(pRoot);..    
2e9f0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
2ea00 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  page at pgnoRoot
2ea10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
2ea20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ea30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2ea40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ea50 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ea60 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
2ea70 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
2ea80 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2ea90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2eaa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2eab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2eac0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ead0 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2eae0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2eaf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2eb00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2eb10 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2eb20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2eb30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2eb40 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
2eb50 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
2eb60 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
2eb70 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2eb80 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
2eb90 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
2eba0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
2ebb0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
2ebc0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2ebd0 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
2ebe0 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
2ebf0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2ec00 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2ec10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2ec20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2ec30 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2ec40 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2ec50 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2ec60 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2ec70 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2ec80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2ec90 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
2eca0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
2ecb0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2ecc0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
2ecd0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
2ece0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ecf0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2ed00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ed10 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ed20 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
2ed30 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  e) );.  zeroPage
2ed40 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20  (pRoot, flags | 
2ed50 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c  PTF_LEAF);.  sql
2ed60 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2ed70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2ed80 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
2ed90 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
2eda0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2edb0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2edc0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
2edd0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
2ede0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
2edf0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
2ee00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
2ee10 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
2ee20 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
2ee30 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
2ee40 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c  e(p, piTable, fl
2ee50 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
2ee60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2ee70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ee80 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69  .** Erase the gi
2ee90 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  ven database pag
2eea0 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68  e and all its ch
2eeb0 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a  ildren.  Return.
2eec0 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  ** the page to t
2eed0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a  he freelist..*/.
2eee0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
2eef0 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20  DatabasePage(.  
2ef00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2ef10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ef20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61  BTree that conta
2ef30 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ins the table */
2ef40 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
2ef50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2ef60 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72   number to clear
2ef70 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2ef80 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
2ef90 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c  arent page.  NUL
2efa0 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a  L for the root *
2efb0 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65  /.  int freePage
2efc0 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61  Flag      /* Dea
2efd0 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20  llocate page if 
2efe0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  true */.){.  Mem
2eff0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2f000 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
2f010 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2f020 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  l;.  int i;..  a
2f030 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2f040 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2f050 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
2f060 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
2f070 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
2f080 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f090 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f0a0 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67  T;.  }..  rc = g
2f0b0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
2f0c0 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c  t, pgno, &pPage,
2f0d0 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28   pParent);.  if(
2f0e0 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2f0f0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2f100 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2f110 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
2f120 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ){.    pCell = f
2f130 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2f140 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
2f150 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2f160 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
2f170 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
2f180 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
2f190 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2f1a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2f1b0 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2f1c0 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  asepage_out;.   
2f1d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61   }.    rc = clea
2f1e0 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
2f1f0 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
2f200 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2f210 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2f220 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
2f230 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  leaf ){.    rc =
2f240 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2f250 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
2f260 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38  (&pPage->aData[8
2f270 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ]), pPage->pPare
2f280 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  nt, 1);.    if( 
2f290 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2f2a0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2f2b0 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
2f2c0 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
2f2d0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2f2e0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
2f2f0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
2f300 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2f310 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
2f320 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2f330 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
2f340 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
2f350 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
2f360 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
2f370 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2f380 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2f390 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2f3a0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2f3b0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
2f3c0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
2f3d0 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
2f3e0 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
2f3f0 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
2f400 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
2f410 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
2f420 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
2f430 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
2f440 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
2f450 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
2f460 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
2f470 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
2f480 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
2f490 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
2f4a0 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
2f4b0 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
2f4c0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
2f4d0 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
2f4e0 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
2f4f0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
2f500 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2f510 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2f520 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74  t iTable){.  int
2f530 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
2f540 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2f550 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2f560 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
2f570 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
2f580 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
2f590 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
2f5a0 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
2f5b0 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2f5c0 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2f5d0 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OR;.  }else if( 
2f5e0 28 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c  (rc = checkReadL
2f5f0 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  ocks(p, iTable, 
2f600 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f  0, 1))!=SQLITE_O
2f610 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68  K ){.    /* noth
2f620 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d  ing to do */.  }
2f630 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f  else if( SQLITE_
2f640 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
2f650 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54  lCursors(pBt, iT
2f660 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  able, 0)) ){.   
2f670 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   /* nothing to d
2f680 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o */.  }else{.  
2f690 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
2f6a0 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50  basePage(pBt, (P
2f6b0 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30  gno)iTable, 0, 0
2f6c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2f6d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2f6e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f6f0 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
2f700 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
2f710 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
2f720 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2f730 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
2f740 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
2f750 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
2f760 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
2f770 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
2f780 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
2f790 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
2f7a0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
2f7b0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2f7c0 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
2f7d0 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
2f7e0 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
2f7f0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
2f800 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
2f810 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
2f820 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
2f830 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
2f840 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
2f850 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
2f860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2f870 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
2f880 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74  ot page .** in t
2f890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f8a0 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74   is moved into t
2f8b0 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  he slot formerly
2f8c0 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20   occupied by.** 
2f8d0 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20  iTable and that 
2f8e0 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72  last slot former
2f8f0 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74  ly occupied by t
2f900 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2f910 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  e.** is added to
2f920 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
2f930 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e  stead of iTable.
2f940 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61    In this say, a
2f950 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
2f960 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65   are kept at the
2f970 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2f980 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2f990 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63   which.** is nec
2f9a0 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56  essary for AUTOV
2f9b0 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69  ACUUM to work ri
2f9c0 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69  ght.  *piMoved i
2f9d0 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
2f9e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
2f9f0 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65  t used to be the
2fa00 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
2fa10 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  in the file befo
2fa20 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20  re.** the move. 
2fa30 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73   If no page gets
2fa40 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64   moved, *piMoved
2fa50 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
2fa60 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   The last root p
2fa70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20  age is recorded 
2fa80 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74  in meta[3] and t
2fa90 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d  he value of.** m
2faa0 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65  eta[3] is update
2fab0 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
2fac0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
2fad0 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c  nt btreeDropTabl
2fae0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2faf0 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d  iTable, int *piM
2fb00 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
2fb10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2fb20 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  e = 0;.  BtShare
2fb30 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2fb40 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2fb50 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2fb60 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70  ex(p) );.  if( p
2fb70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2fb80 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2fb90 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2fba0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2fbb0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2fbc0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ROR;.  }..  /* I
2fbd0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
2fbe0 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20  drop a table if 
2fbf0 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20  any cursors are 
2fc00 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  open on the.  **
2fc10 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
2fc20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75  is because in au
2fc30 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to-vacuum mode t
2fc40 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20  he backend may. 
2fc50 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65   ** need to move
2fc60 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61   another root-pa
2fc70 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70  ge to fill a gap
2fc80 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
2fc90 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70  eted.  ** root p
2fca0 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20  age. If an open 
2fcb0 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
2fcc0 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f   this page a pro
2fcd0 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  blem would .  **
2fce0 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69   occur..  */.  i
2fcf0 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  f( pBt->pCursor 
2fd00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2fd10 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d  LITE_LOCKED;.  }
2fd20 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2fd30 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
2fd40 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
2fd50 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  &pPage, 0);.  if
2fd60 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2fd70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2fd80 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
2fd90 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66  p, iTable);.  if
2fda0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65  ( rc ){.    rele
2fdb0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2fdc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2fdd0 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d   }..  *piMoved =
2fde0 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c   0;..  if( iTabl
2fdf0 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51  e>1 ){.#ifdef SQ
2fe00 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2fe10 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72  CUUM.    rc = fr
2fe20 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2fe30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2fe40 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  Page);.#else.   
2fe50 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2fe60 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67  cuum ){.      Pg
2fe70 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a  no maxRootPgno;.
2fe80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fe90 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2fea0 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e  , 4, &maxRootPgn
2feb0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2fec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fed0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2fee0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2fef0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ff00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2ff10 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74   iTable==maxRoot
2ff20 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
2ff30 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
2ff40 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73  being dropped is
2ff50 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
2ff60 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
2ff70 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
2ff80 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
2ff90 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68 65  atabase, put the
2ffa0 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68   root page on th
2ffb0 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20  e free list. .  
2ffc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ffd0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2ffe0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2fff0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
30000 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30010 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30020 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
30030 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
30040 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30050 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
30060 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64   being dropped d
30070 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65  oes not have the
30080 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
30090 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
300a0 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
300b0 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68  base. So move th
300c0 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  e page that does
300d0 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20   into the .     
300e0 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62     ** gap left b
300f0 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f  y the deleted ro
30100 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ot-page..       
30110 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   */.        MemP
30120 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20  age *pMove;.    
30130 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30140 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
30150 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
30160 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61  eGetPage(pBt, ma
30170 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
30180 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
30190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
301a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
301b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
301c0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
301d0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
301e0 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f  , pMove, PTRMAP_
301f0 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61  ROOTPAGE, 0, iTa
30200 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ble);.        re
30210 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
30220 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30230 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30240 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30250 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
30260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30270 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
30280 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
30290 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
302a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
302b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
302c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
302d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
302e0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
302f0 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Move);.        r
30300 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
30310 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30320 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30330 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
30340 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
30350 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20         *piMoved 
30360 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  = maxRootPgno;. 
30370 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
30380 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61   Set the new 'ma
30390 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c  x-root-page' val
303a0 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ue in the databa
303b0 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a  se header. This.
303c0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
303d0 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f  old value less o
303e0 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72  ne, less one mor
303f0 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e  e if that happen
30400 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
30410 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d   a root-page num
30420 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67  ber, less one ag
30430 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74  ain if that is t
30440 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44  he.      ** PEND
30450 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20  ING_BYTE_PAGE.. 
30460 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61       */.      ma
30470 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
30480 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
30490 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
304a0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
304b0 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
304c0 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
304d0 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
304e0 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  no==PTRMAP_PAGEN
304f0 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  O(pBt, maxRootPg
30500 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  no) ){.        m
30510 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
30520 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
30530 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21  rt( maxRootPgno!
30540 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
30550 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  GE(pBt) );..    
30560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
30570 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
30580 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29   4, maxRootPgno)
30590 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
305a0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
305b0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  (pPage);.      r
305c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
305d0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
305e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
305f0 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  If sqlite3BtreeD
30600 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c  ropTable was cal
30610 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  led on page 1. *
30620 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  /.    zeroPage(p
30630 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59  Page, PTF_INTKEY
30640 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20  |PTF_LEAF );.   
30650 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
30660 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
30670 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71  n rc;  .}.int sq
30680 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
30690 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
306a0 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
306b0 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
306c0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
306d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
306e0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
306f0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f  .  rc = btreeDro
30700 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65  pTable(p, iTable
30710 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71  , piMoved);.  sq
30720 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
30730 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
30740 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
30750 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  the meta-informa
30760 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61  tion out of a da
30770 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65  tabase file.  Me
30780 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20  ta[0].** is the 
30790 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  number of free p
307a0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
307b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
307c0 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f   Meta[1].** thro
307d0 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65  ugh meta[15] are
307e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
307f0 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79  se by higher lay
30800 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a  ers.  Meta[0].**
30810 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74   is read-only, t
30820 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65  he others are re
30830 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a  ad/write..** .**
30840 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65   The schema laye
30850 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76  r numbers meta v
30860 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c  alues differentl
30870 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d  y.  At the schem
30880 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20  a.** layer (and 
30890 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e  the SetCookie an
308a0 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63  d ReadCookie opc
308b0 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72  odes) the number
308c0 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65   of.** free page
308d0 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  s is not visible
308e0 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20  .  So Cookie[0] 
308f0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d  is the same as M
30900 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73  eta[1]..*/.int s
30910 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
30920 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
30930 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61   idx, u32 *pMeta
30940 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
30950 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
30960 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
30970 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64  *pP1;.  BtShared
30980 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
30990 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
309a0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
309b0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
309c0 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61  * Reading a meta
309d0 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75  -data value requ
309e0 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
309f0 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20   on page 1 (and 
30a00 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73  hence.  ** the s
30a10 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
30a20 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73  le. We grab this
30a30 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73   lock regardless
30a40 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20   of whether or. 
30a50 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49   ** not the SQLI
30a60 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
30a70 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28  ed flag is set (
30a80 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
30a90 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20   at page.  ** 1 
30aa0 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20  is treated as a 
30ab0 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20  special case by 
30ac0 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29  queryTableLock()
30ad0 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29   and lockTable()
30ae0 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71  )..  */.  rc = q
30af0 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
30b00 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
30b10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
30b30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
30b40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
30b50 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
30b60 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
30b70 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
30b80 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
30b90 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50  pPager, 1, &pDbP
30ba0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
30bb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
30bc0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
30bd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
30be0 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64   pP1 = (unsigned
30bf0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
30c00 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
30c10 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d  age);.  *pMeta =
30c20 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b 33   get4byte(&pP1[3
30c30 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73  6 + idx*4]);.  s
30c40 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
30c50 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  (pDbPage);..  /*
30c60 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64   If autovacuumed
30c70 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
30c80 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77  this build but w
30c90 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
30ca0 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20  .  ** access an 
30cb0 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74  autovacuumed dat
30cc0 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65  abase, then make
30cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
30ce0 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69  adonly. .  */.#i
30cf0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
30d00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
30d10 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65  ( idx==4 && *pMe
30d20 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64  ta>0 ) pBt->read
30d30 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  Only = 1;.#endif
30d40 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20  ..  /* Grab the 
30d50 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
30d60 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c  e 1. */.  rc = l
30d70 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52  ockTable(p, 1, R
30d80 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c  EAD_LOCK);.  sql
30d90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
30da0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
30db0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d  }../*.** Write m
30dc0 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
30dd0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
30de0 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d  tabase.  Meta[0]
30df0 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79   is.** read-only
30e00 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20   and may not be 
30e10 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  written..*/.int 
30e20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
30e30 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  teMeta(Btree *p,
30e40 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d   int idx, u32 iM
30e50 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64  eta){.  BtShared
30e60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
30e70 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
30e80 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pP1;.  int rc;.
30e90 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31    assert( idx>=1
30ea0 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
30eb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
30ec0 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
30ed0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
30ee0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
30ef0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
30f00 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
30f10 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
30f20 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
30f30 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
30f40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
30f50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70  age1!=0 );.    p
30f60 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
30f70 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
30f80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30f90 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
30fa0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
30fb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30fc0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
30fd0 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
30fe0 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66  *4], iMeta);.#if
30ff0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31000 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31010 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a    if( idx==7 ){.
31020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31030 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31040 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20  || iMeta==0 );. 
31050 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
31060 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61  Meta==0 || iMeta
31070 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
31080 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
31090 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a   iMeta;.      }.
310a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
310b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
310c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
310d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
310e0 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62  eturn the flag b
310f0 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  yte at the begin
31100 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65  ning of the page
31110 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
31120 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
31130 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
31140 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
31150 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  eFlags(BtCursor 
31160 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
31170 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55  O: What about CU
31180 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
31190 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79   state? Probably
311a0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20   need to call.  
311b0 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ** restoreOrClea
311c0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
311d0 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d  ) here..  */.  M
311e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
311f0 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
31200 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
31210 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ur);.  pPage = p
31220 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
31230 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
31240 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
31250 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
31260 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20  >pBt==pCur->pBt 
31270 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
31280 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e ? pPage->aData
31290 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
312a0 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  t] : 0;.}.../*.*
312b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
312c0 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
312d0 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69  th a BTree.  Thi
312e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
312f0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
31300 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
31310 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73  nly..*/.Pager *s
31320 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
31330 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
31340 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61  turn p->pBt->pPa
31350 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ger;.}..#ifndef 
31360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
31370 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
31380 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
31390 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
313a0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
313b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
313c0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
313d0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
313e0 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
313f0 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
31400 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
31410 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
31420 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 32  p;.  char *zMsg2
31430 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d  ;.  if( !pCheck-
31440 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b  >mxErr ) return;
31450 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  .  pCheck->mxErr
31460 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45  --;.  pCheck->nE
31470 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74  rr++;.  va_start
31480 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
31490 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65 33   zMsg2 = sqlite3
314a0 56 4d 50 72 69 6e 74 66 28 30 2c 20 7a 46 6f 72  VMPrintf(0, zFor
314b0 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
314c0 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d  nd(ap);.  if( zM
314d0 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d  sg1==0 ) zMsg1 =
314e0 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63   "";.  if( pChec
314f0 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  k->zErrMsg ){.  
31500 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70    char *zOld = p
31510 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a  Check->zErrMsg;.
31520 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72      pCheck->zErr
31530 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Msg = 0;.    sql
31540 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
31550 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20  Check->zErrMsg, 
31560 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67  zOld, "\n", zMsg
31570 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a  1, zMsg2, (char*
31580 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )0);.    sqlite3
31590 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d  _free(zOld);.  }
315a0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
315b0 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65  3SetString(&pChe
315c0 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73  ck->zErrMsg, zMs
315d0 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72  g1, zMsg2, (char
315e0 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  *)0);.  }.  sqli
315f0 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 32 29 3b  te3_free(zMsg2);
31600 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
31610 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
31620 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
31630 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31640 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
31650 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20  ./*.** Add 1 to 
31660 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
31670 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61  unt for page iPa
31680 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ge.  If this is 
31690 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65  the second.** re
316a0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
316b0 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f  age, add an erro
316c0 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68  r message to pCh
316d0 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  eck->zErrMsg..**
316e0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
316f0 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72  re are 2 ore mor
31700 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
31710 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69  the page and 0 i
31720 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  f.** if this is 
31730 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65  the first refere
31740 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e  nce to the page.
31750 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63  .**.** Also chec
31760 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
31770 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75  number is in bou
31780 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nds..*/.static i
31790 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65  nt checkRef(Inte
317a0 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
317b0 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72   int iPage, char
317c0 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69   *zContext){.  i
317d0 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
317e0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50  turn 1;.  if( iP
317f0 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67  age>pCheck->nPag
31800 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a  e || iPage<0 ){.
31810 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31820 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
31830 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61  ext, "invalid pa
31840 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69  ge number %d", i
31850 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
31860 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
31870 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
31880 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68  ge]==1 ){.    ch
31890 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
318a0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
318b0 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f  2nd reference to
318c0 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
318d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
318e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28  .  }.  return  (
318f0 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
31900 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69  age]++)>1;.}..#i
31910 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31920 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
31930 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
31940 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  e entry in the p
31950 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70  ointer-map for p
31960 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20  age iChild maps 
31970 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72  to .** page iPar
31980 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70  ent, pointer typ
31990 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f  e ptrType. If no
319a0 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72  t, append an err
319b0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f  or message.** to
319c0 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74   pCheck..*/.stat
319d0 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72  ic void checkPtr
319e0 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79  map(.  Integrity
319f0 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a  Ck *pCheck,   /*
31a00 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
31a10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67   context */.  Pg
31a20 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
31a30 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61       /* Child pa
31a40 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75  ge number */.  u
31a50 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
31a60 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
31a70 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79  d pointer map ty
31a80 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61  pe */.  Pgno iPa
31a90 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f  rent,          /
31aa0 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
31ab0 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61  er map parent pa
31ac0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
31ad0 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
31ae0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
31af0 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73   description (us
31b00 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67  ed for error msg
31b10 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
31b20 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79  ;.  u8 ePtrmapTy
31b30 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d  pe;.  Pgno iPtrm
31b40 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20  apParent;..  rc 
31b50 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65  = ptrmapGet(pChe
31b60 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c  ck->pBt, iChild,
31b70 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26   &ePtrmapType, &
31b80 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
31b90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31ba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  _OK ){.    check
31bb0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31bc0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69  , zContext, "Fai
31bd0 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d  led to read ptrm
31be0 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69  ap key=%d", iChi
31bf0 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ld);.    return;
31c00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72  .  }..  if( ePtr
31c10 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c  mapType!=eType |
31c20 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21  | iPtrmapParent!
31c30 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  =iParent ){.    
31c40 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31c50 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
31c60 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74 72   .      "Bad ptr
31c70 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25   map entry key=%
31c80 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25  d expected=(%d,%
31c90 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c  d) got=(%d,%d)",
31ca0 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20   .      iChild, 
31cb0 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20  eType, iParent, 
31cc0 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74  ePtrmapType, iPt
31cd0 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  rmapParent);.  }
31ce0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
31cf0 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
31d00 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
31d10 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76  list or of an ov
31d20 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
31d30 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  ..** Verify that
31d40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
31d50 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74  ages on the list
31d60 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   is N..*/.static
31d70 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28   void checkList(
31d80 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
31d90 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65  pCheck,  /* Inte
31da0 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63  grity checking c
31db0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
31dc0 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20  isFreeList,     
31dd0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
31de0 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65  freelist.  False
31df0 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61   for overflow pa
31e00 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ge list */.  int
31e10 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
31e20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
31e30 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67 65  r for first page
31e40 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
31e50 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
31e60 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
31e70 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ted number of pa
31e80 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
31e90 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
31ea0 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ext        /* Co
31eb0 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20  ntext for error 
31ec0 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  messages */.){. 
31ed0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78   int i;.  int ex
31ee0 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e  pected = N;.  in
31ef0 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65  t iFirst = iPage
31f00 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e  ;.  while( N-- >
31f10 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78   0 && pCheck->mx
31f20 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67  Err ){.    DbPag
31f30 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20  e *pOvflPage;.  
31f40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
31f50 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20  *pOvflData;.    
31f60 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20  if( iPage<1 ){. 
31f70 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
31f80 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
31f90 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22  text,.         "
31fa0 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d  %d of %d pages m
31fb0 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72  issing from over
31fc0 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69  flow list starti
31fd0 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20  ng at %d",.     
31fe0 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74       N+1, expect
31ff0 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20  ed, iFirst);.   
32000 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
32010 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66      if( checkRef
32020 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
32030 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61  zContext) ) brea
32040 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  k;.    if( sqlit
32050 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65 63  e3PagerGet(pChec
32060 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f  k->pPager, (Pgno
32070 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61  )iPage, &pOvflPa
32080 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ge) ){.      che
32090 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
320a0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66  ck, zContext, "f
320b0 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67  ailed to get pag
320c0 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
320d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
320e0 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20  }.    pOvflData 
320f0 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
32100 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
32110 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65  etData(pOvflPage
32120 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72 65  );.    if( isFre
32130 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  eList ){.      i
32140 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  nt n = get4byte(
32150 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a  &pOvflData[4]);.
32160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32170 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
32180 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
32190 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
321a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
321b0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
321c0 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
321d0 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74  EEPAGE, 0, zCont
321e0 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
321f0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e  ndif.      if( n
32200 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73  >pCheck->pBt->us
32210 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b 0a  ableSize/4-2 ){.
32220 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
32230 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
32240 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
32250 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65      "freelist le
32260 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67  af count too big
32270 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50   on page %d", iP
32280 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d  age);.        N-
32290 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
322a0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
322b0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
322c0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
322d0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
322e0 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34  &pOvflData[8+i*4
322f0 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
32300 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32310 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  UM.          if(
32320 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
32330 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
32340 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
32350 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65  map(pCheck, iFre
32360 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  ePage, PTRMAP_FR
32370 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74  EEPAGE, 0, zCont
32380 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ext);.          
32390 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
323a0 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65     checkRef(pChe
323b0 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a  ck, iFreePage, z
323c0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
323d0 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d    }.        N -=
323e0 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
323f0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
32400 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
32410 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
32420 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
32430 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
32440 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50  to-vacuum and iP
32450 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  age is not the l
32460 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ast.      ** pag
32470 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c  e in this overfl
32480 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74  ow list, check t
32490 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hat the pointer-
324a0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
324b0 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
324c0 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65  wing page matche
324d0 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a  s iPage..      *
324e0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  /.      if( pChe
324f0 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
32500 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20  uum && N>0 ){.  
32510 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62 79        i = get4by
32520 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20  te(pOvflData);. 
32530 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
32540 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54  ap(pCheck, i, PT
32550 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
32560 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
32570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32580 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65  #endif.    iPage
32590 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
325a0 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  lData);.    sqli
325b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
325c0 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  vflPage);.  }.}.
325d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
325e0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
325f0 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
32600 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
32610 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
32620 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73  .** Do various s
32630 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20  anity checks on 
32640 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66  a single page of
32650 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e   a tree.  Return
32660 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70  .** the tree dep
32670 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20  th.  Root pages 
32680 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e  return 0.  Paren
32690 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  ts of root pages
326a0 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e  .** return 1, an
326b0 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a  d so forth..** .
326c0 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20  ** These checks 
326d0 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  are done:.**.** 
326e0 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75       1.  Make su
326f0 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e  re that cells an
32700 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20  d freeblocks do 
32710 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20  not overlap.**  
32720 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62          but comb
32730 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ine to completel
32740 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65  y cover the page
32750 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61  ..**  NO  2.  Ma
32760 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79  ke sure cell key
32770 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a  s are in order..
32780 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65  **  NO  3.  Make
32790 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
327a0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
327b0 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e  al to zLowerBoun
327c0 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d  d..**  NO  4.  M
327d0 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
327e0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
327f0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70  or equal to zUpp
32800 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20  erBound..**     
32810 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69   5.  Check the i
32820 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72  ntegrity of over
32830 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20  flow pages..**  
32840 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76      6.  Recursiv
32850 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72  ely call checkTr
32860 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68  eePage on all ch
32870 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20  ildren..**      
32880 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  7.  Verify that 
32890 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c  the depth of all
328a0 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65   children is the
328b0 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38   same..**      8
328c0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .  Make sure thi
328d0 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61  s page is at lea
328e0 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65  st 33% full or e
328f0 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  lse it is.**    
32900 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f        the root o
32910 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73  f the tree..*/.s
32920 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54  tatic int checkT
32930 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67  reePage(.  Integ
32940 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
32950 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
32960 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  the sanity check
32970 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
32980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32990 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
329a0 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20  e page to check 
329b0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
329c0 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61  arent,     /* Pa
329d0 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63  rent page */.  c
329e0 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74  har *zParentCont
329f0 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63  ext  /* Parent c
32a00 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d  ontext */.){.  M
32a10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
32a20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74   int i, rc, dept
32a30 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74  h, d2, pgno, cnt
32a40 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c  ;.  int hdr, cel
32a50 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43  lStart;.  int nC
32a60 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b  ell;.  u8 *data;
32a70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32a80 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
32a90 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74  ze;.  char zCont
32aa0 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72  ext[100];.  char
32ab0 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65   *hit;..  sqlite
32ac0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
32ad0 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f  f(zContext), zCo
32ae0 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a  ntext, "Page %d:
32af0 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f   ", iPage);..  /
32b00 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
32b10 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a   page exists.  *
32b20 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b  /.  pBt = pCheck
32b30 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53  ->pBt;.  usableS
32b40 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
32b50 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61  eSize;.  if( iPa
32b60 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
32b70 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66  ;.  if( checkRef
32b80 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
32b90 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20  zParentContext) 
32ba0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
32bb0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  ( (rc = sqlite3B
32bc0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
32bd0 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70   (Pgno)iPage, &p
32be0 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Page, 0))!=0 ){.
32bf0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
32c00 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
32c10 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61  ext,.       "una
32c20 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70  ble to get the p
32c30 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d  age. error code=
32c40 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  %d", rc);.    re
32c50 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
32c60 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  ( (rc = sqlite3B
32c70 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
32c80 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30  ge, pParent))!=0
32c90 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
32ca0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
32cb0 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
32cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71               "sq
32cd0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
32ce0 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72  ge() returns err
32cf0 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29  or code %d", rc)
32d00 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
32d10 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
32d20 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
32d30 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20  * Check out all 
32d40 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  the cells..  */.
32d50 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66    depth = 0;.  f
32d60 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
32d70 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b  >nCell && pCheck
32d80 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20  ->mxErr; i++){. 
32d90 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
32da0 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65    int sz;.    Ce
32db0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
32dc0 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f    /* Check paylo
32dd0 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ad overflow page
32de0 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  s.    */.    sql
32df0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32e00 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
32e10 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
32e20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20         "On tree 
32e30 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a  page %d cell %d:
32e40 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20   ", iPage, i);. 
32e50 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
32e60 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20  ell(pPage,i);.  
32e70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
32e80 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
32e90 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
32ea0 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e  .    sz = info.n
32eb0 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70  Data;.    if( !p
32ec0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73  Page->intKey ) s
32ed0 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  z += info.nKey;.
32ee0 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d      assert( sz==
32ef0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
32f00 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f  .    if( sz>info
32f10 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
32f20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a   int nPage = (sz
32f30 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
32f40 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29   usableSize - 5)
32f50 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  /(usableSize - 4
32f60 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  );.      Pgno pg
32f70 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
32f80 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
32f90 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64  verflow]);.#ifnd
32fa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32fb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
32fc0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
32fd0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
32fe0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
32ff0 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  k, pgnoOvfl, PTR
33000 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69  MAP_OVERFLOW1, i
33010 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
33020 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
33030 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28        checkList(
33040 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f  pCheck, 0, pgnoO
33050 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e  vfl, nPage, zCon
33060 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  text);.    }..  
33070 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74    /* Check sanit
33080 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20  y of left child 
33090 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
330a0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
330b0 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20  f ){.      pgno 
330c0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
330d0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
330e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
330f0 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
33100 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
33110 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
33120 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ap(pCheck, pgno,
33130 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69   PTRMAP_BTREE, i
33140 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
33150 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
33160 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b        d2 = check
33170 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c  TreePage(pCheck,
33180 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74  pgno,pPage,zCont
33190 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
331a0 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68  i>0 && d2!=depth
331b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
331c0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
331d0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68  k, zContext, "Ch
331e0 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64  ild page depth d
331f0 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20  iffers");.      
33200 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20  }.      depth = 
33210 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d2;.    }.  }.  
33220 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
33230 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
33240 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
33250 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
33260 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
33270 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
33280 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
33290 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20  ), zContext, .  
332a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332b0 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61     "On page %d a
332c0 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22  t right child: "
332d0 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65  , iPage);.#ifnde
332e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
332f0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
33300 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
33310 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50   ){.      checkP
33320 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
33330 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
33340 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  , iPage, 0);.   
33350 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
33360 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
33370 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c  ck, pgno, pPage,
33380 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a   zContext);.  }.
33390 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72   .  /* Check for
333a0 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61   complete covera
333b0 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  ge of the page. 
333c0 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61   */.  data = pPa
333d0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
333e0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
333f0 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c  set;.  hit = sql
33400 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
33410 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
33420 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a 20 20  .  if( hit ){.  
33430 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 30 2c    memset(hit, 0,
33440 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
33450 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31     memset(hit, 1
33460 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  , get2byte(&data
33470 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e  [hdr+5]));.    n
33480 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
33490 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
334a0 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20 68     cellStart = h
334b0 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
334c0 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72  e->leaf;.    for
334d0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
334e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
334f0 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
33500 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32  ta[cellStart+i*2
33510 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20 73 69  ]);.      u16 si
33520 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
33530 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
33540 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ]);.      int j;
33550 0a 20 20 20 20 20 20 69 66 28 20 28 70 63 2b 73  .      if( (pc+s
33560 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69  ize-1)>=usableSi
33570 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20  ze || pc<0 ){.  
33580 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
33590 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
335a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f  .            "Co
335b0 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
335c0 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20  d in cell %d on 
335d0 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65  page %d",i,iPage
335e0 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
335f0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
33600 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63  pc+size-1; j>=pc
33610 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
33620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33630 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d     for(cnt=0, i=
33640 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
33650 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69  dr+1]); i>0 && i
33660 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  <usableSize && c
33670 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20  nt<10000; .     
33680 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20        cnt++){.  
33690 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67      int size = g
336a0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b  et2byte(&data[i+
336b0 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  2]);.      int j
336c0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b 73  ;.      if( (i+s
336d0 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69  ize-1)>=usableSi
336e0 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20  ze || i<0 ){.   
336f0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
33700 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20  Msg(pCheck, 0,  
33710 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f  .            "Co
33720 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
33730 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20  d in cell %d on 
33740 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65  page %d",i,iPage
33750 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
33760 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
33770 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20  i+size-1; j>=i; 
33780 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
33790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
337a0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
337b0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
337c0 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73  or(i=cnt=0; i<us
337d0 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  ableSize; i++){.
337e0 20 20 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d        if( hit[i]
337f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
33800 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
33810 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29  e if( hit[i]>1 )
33820 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
33830 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
33840 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d   0,.          "M
33850 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72  ultiple uses for
33860 20 62 79 74 65 20 25 64 20 6f 66 20 70 61 67 65   byte %d of page
33870 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b   %d", i, iPage);
33880 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
33890 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
338a0 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b    if( cnt!=data[
338b0 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20  hdr+7] ){.      
338c0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
338d0 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
338e0 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64       "Fragmented
338f0 20 73 70 61 63 65 20 69 73 20 25 64 20 62 79 74   space is %d byt
33900 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 25 64  e reported as %d
33910 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20   on page %d",.  
33920 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74          cnt, dat
33930 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29  a[hdr+7], iPage)
33940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
33950 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 68 69  lite3PageFree(hi
33960 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61  t);..  releasePa
33970 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
33980 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23  urn depth+1;.}.#
33990 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
339a0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
339b0 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
339c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
339d0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
339e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
339f0 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  does a complete 
33a00 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76  check of the giv
33a10 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20  en BTree file.  
33a20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e  aRoot[] is.** an
33a30 20 61 72 72 61 79 20 6f 66 20 70 61 67 65 73 20   array of pages 
33a40 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65 61 63  numbers were eac
33a50 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  h page number is
33a60 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
33a70 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e  f.** a table.  n
33a80 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62  Root is the numb
33a90 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
33aa0 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   aRoot..**.** If
33ab0 20 65 76 65 72 79 74 68 69 6e 67 20 63 68 65 63   everything chec
33ac0 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75  ks out, this rou
33ad0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
33ae0 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  L.  If something
33af0 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e   is.** amiss, an
33b00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
33b10 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  s written into m
33b20 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
33b30 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20  rom malloc().** 
33b40 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
33b50 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73   that error mess
33b60 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
33b70 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
33b80 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
33b90 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
33ba0 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  eing the error m
33bb0 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20 69  essage when it i
33bc0 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20  s done..*/.char 
33bd0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74  *sqlite3BtreeInt
33be0 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42  egrityCheck(.  B
33bf0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20  tree *p,     /* 
33c00 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  The btree to be 
33c10 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  checked */.  int
33c20 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e   *aRoot,   /* An
33c30 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70   array of root p
33c40 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  ages numbers for
33c50 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65   individual tree
33c60 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  s */.  int nRoot
33c70 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ,    /* Number o
33c80 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
33c90 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ot[] */.  int mx
33ca0 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20  Err,    /* Stop 
33cb0 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73  reporting errors
33cc0 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79   after this many
33cd0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72   */.  int *pnErr
33ce0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d      /* Write num
33cf0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
33d00 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  en to this varia
33d10 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
33d20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20  i;.  int nRef;. 
33d30 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68   IntegrityCk sCh
33d40 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  eck;.  BtShared 
33d50 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
33d60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
33d70 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
33d80 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e 52 65  b = p->db;.  nRe
33d90 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
33da0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
33db0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63  ager);.  if( loc
33dc0 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28  kBtreeWithRetry(
33dd0 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  p)!=SQLITE_OK ){
33de0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
33df0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
33e00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
33e10 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61  Dup("Unable to a
33e20 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f  cquire a read lo
33e30 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
33e40 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65  se");.  }.  sChe
33e50 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  ck.pBt = pBt;.  
33e60 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20  sCheck.pPager = 
33e70 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73  pBt->pPager;.  s
33e80 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 61  Check.nPage = pa
33e90 67 65 72 50 61 67 65 63 6f 75 6e 74 28 73 43 68  gerPagecount(sCh
33ea0 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a 20 20 73  eck.pPager);.  s
33eb0 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78  Check.mxErr = mx
33ec0 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45  Err;.  sCheck.nE
33ed0 72 72 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72  rr = 0;.  *pnErr
33ee0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
33ef0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
33f00 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
33f10 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
33f20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20   sCheck.nPage = 
33f30 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d  pBt->nTrunc;.  }
33f40 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43  .#endif.  if( sC
33f50 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b  heck.nPage==0 ){
33f60 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
33f70 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
33f80 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
33f90 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
33fa0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
33fb0 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
33fc0 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43 68 65  te3Malloc( (sChe
33fd0 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65  ck.nPage+1)*size
33fe0 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  of(sCheck.anRef[
33ff0 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43  0]) );.  if( !sC
34000 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20  heck.anRef ){.  
34010 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
34020 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
34030 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20  *pnErr = 1;.    
34040 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
34050 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
34060 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
34070 70 2d 3e 64 62 2c 20 22 55 6e 61 62 6c 65 20 74  p->db, "Unable t
34080 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74 65  o malloc %d byte
34090 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73 43  s", .        (sC
340a0 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
340b0 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
340c0 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f  f[0]));.  }.  fo
340d0 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b  r(i=0; i<=sCheck
340e0 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43  .nPage; i++){ sC
340f0 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
34100 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49  0; }.  i = PENDI
34110 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
34120 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65  );.  if( i<=sChe
34130 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  ck.nPage ){.    
34140 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
34150 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63  = 1;.  }.  sChec
34160 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  k.zErrMsg = 0;..
34170 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69    /* Check the i
34180 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
34190 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20  freelist.  */.  
341a0 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63  checkList(&sChec
341b0 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28 26  k, 1, get4byte(&
341c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
341d0 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20  ta[32]),.       
341e0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
341f0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
34200 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72  a[36]), "Main fr
34210 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f  eelist: ");..  /
34220 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20  * Check all the 
34230 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
34240 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20  or(i=0; i<nRoot 
34250 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b  && sCheck.mxErr;
34260 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
34270 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Root[i]==0 ) con
34280 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
34290 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
342a0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
342b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
342c0 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20   aRoot[i]>1 ){. 
342d0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
342e0 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
342f0 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  i], PTRMAP_ROOTP
34300 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AGE, 0, 0);.    
34310 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65  }.#endif.    che
34320 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68 65  ckTreePage(&sChe
34330 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c  ck, aRoot[i], 0,
34340 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72   "List of tree r
34350 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20  oots: ");.  }.. 
34360 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76   /* Make sure ev
34370 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
34380 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63  file is referenc
34390 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ed.  */.  for(i=
343a0 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  1; i<=sCheck.nPa
343b0 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45  ge && sCheck.mxE
343c0 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66  rr; i++){.#ifdef
343d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
343e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
343f0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
34400 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  =0 ){.      chec
34410 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
34420 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
34430 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
34440 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  i);.    }.#else.
34450 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
34460 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
34470 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b  auto-vacuum, mak
34480 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73  e sure no tables
34490 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
344a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f  references to po
344b0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
344c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
344d0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
344e0 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50  =0 && .       (P
344f0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
34500 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d  , i)!=i || !pBt-
34510 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a  >autoVacuum) ){.
34520 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
34530 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
34540 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
34550 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
34560 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68 65    }.    if( sChe
34570 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26  ck.anRef[i]!=0 &
34580 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
34590 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
345a0 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f  ==i && pBt->auto
345b0 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20  Vacuum) ){.     
345c0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
345d0 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69  &sCheck, 0, "Poi
345e0 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25 64  nter map page %d
345f0 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c   is referenced",
34600 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   i);.    }.#endi
34610 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  f.  }..  /* Make
34620 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79   sure this analy
34630 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76  sis did not leav
34640 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61  e any unref() pa
34650 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63  ges.  */.  unloc
34660 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
34670 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20  Bt);.  if( nRef 
34680 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  != sqlite3PagerR
34690 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
346a0 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63  ger) ){.    chec
346b0 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
346c0 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f  ck, 0, .      "O
346d0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
346e0 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20  count goes from 
346f0 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20  %d to %d during 
34700 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a  this analysis",.
34710 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69        nRef, sqli
34720 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
34730 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20  (pBt->pPager).  
34740 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43    );.  }..  /* C
34750 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70  lean  up and rep
34760 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  ort errors..  */
34770 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
34780 65 61 76 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  eave(p);.  sqlit
34790 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b 2e 61  e3_free(sCheck.a
347a0 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20  nRef);.  *pnErr 
347b0 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20  = sCheck.nErr;. 
347c0 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a   return sCheck.z
347d0 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66  ErrMsg;.}.#endif
347e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
347f0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
34800 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
34810 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
34820 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  me of the underl
34830 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
34840 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  le..**.** The pa
34850 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  ger filename is 
34860 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
34870 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
34880 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
34890 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
348a0 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
348b0 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
348c0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
348d0 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
348e0 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
348f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
34900 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
34910 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
34920 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
34930 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
34940 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
34950 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
34960 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
34970 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
34980 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
34990 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64 69 72  ** The pager dir
349a0 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73 20 69  ectory name is i
349b0 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67  nvariant as long
349c0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73   as the pager is
349d0 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69  .** open so it i
349e0 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73  s safe to access
349f0 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53   without the BtS
34a00 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a  hared mutex..*/.
34a10 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
34a20 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61  te3BtreeGetDirna
34a30 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
34a40 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
34a50 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
34a60 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
34a70 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74  erDirname(p->pBt
34a80 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
34a90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
34aa0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
34ab0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
34ac0 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 54  this database. T
34ad0 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c  he return.** val
34ae0 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ue of this routi
34af0 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 72  ne is the same r
34b00 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
34b10 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
34b20 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
34b30 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74  n created or not
34b40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
34b50 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
34b60 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
34b70 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
34b80 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
34b90 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
34ba0 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
34bb0 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
34bc0 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
34bd0 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
34be0 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74  etJournalname(Bt
34bf0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
34c00 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
34c10 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
34c20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
34c30 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  rnalname(p->pBt-
34c40 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66  >pPager);.}..#if
34c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34c60 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f  _VACUUM./*.** Co
34c70 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  py the complete 
34c80 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72  content of pBtFr
34c90 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20  om into pBtTo.  
34ca0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  A transaction.**
34cb0 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
34cc0 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a  for both files..
34cd0 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
34ce0 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79 20 62  f file pTo may b
34cf0 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69  e reduced by thi
34d00 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  s operation..** 
34d10 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
34d20 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e   wrong, the tran
34d30 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69  saction on pTo i
34d40 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a  s rolled back. .
34d50 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
34d60 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61 73 65  ful, CommitPhase
34d70 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63 61 6c  One() may be cal
34d80 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66 6f 72  led on pTo befor
34d90 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a  e returning. .**
34da0 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
34db0 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d 69 74  ld finish commit
34dc0 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ting the transac
34dd0 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79 20 63  tion on pTo by c
34de0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
34df0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e 0a  3BtreeCommit()..
34e00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
34e10 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65  reeCopyFile(Btre
34e20 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70  e *pTo, Btree *p
34e30 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20  From){.  int rc 
34e40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
34e50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f 20 6e  gno i;..  Pgno n
34e60 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20 2f 2a  FromPage;     /*
34e70 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
34e80 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 50   in pFrom */.  P
34e90 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20 20 20  gno nToPage;    
34ea0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
34eb0 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a 2f 0a  pages in pTo */.
34ec0 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67 65 3b    Pgno nNewPage;
34ed0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
34ee0 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20  of pages in pTo 
34ef0 61 66 74 65 72 20 74 68 65 20 63 6f 70 79 20 2a  after the copy *
34f00 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69 70 3b  /..  Pgno iSkip;
34f10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64           /* Pend
34f20 69 6e 67 20 62 79 74 65 20 70 61 67 65 20 69 6e  ing byte page in
34f30 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54   pTo */.  int nT
34f40 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20 2f 2a  oPageSize;    /*
34f50 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 54   Page size of pT
34f60 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  o in bytes */.  
34f70 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  int nFromPageSiz
34f80 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  e;  /* Page size
34f90 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62 79 74   of pFrom in byt
34fa0 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61 72 65  es */..  BtShare
34fb0 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e  d *pBtTo = pTo->
34fc0 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pBt;.  BtShared 
34fd0 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  *pBtFrom = pFrom
34fe0 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f 2d 3e  ->pBt;.  pBtTo->
34ff0 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20  db = pTo->db;.  
35000 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20 70 46  pBtFrom->db = pF
35010 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f 50  rom->db;..  nToP
35020 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54 6f 2d  ageSize = pBtTo-
35030 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e 46 72  >pageSize;.  nFr
35040 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  omPageSize = pBt
35050 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  From->pageSize;.
35060 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72  .  if( pTo->inTr
35070 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
35080 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61   || pFrom->inTra
35090 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
350a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
350b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
350c0 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75    if( pBtTo->pCu
350d0 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rsor ){.    retu
350e0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
350f0 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65 20 3d    }..  nToPage =
35100 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
35110 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a  pBtTo->pPager);.
35120 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d 20 70 61    nFromPage = pa
35130 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
35140 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20  From->pPager);. 
35150 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47   iSkip = PENDING
35160 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f  _BYTE_PAGE(pBtTo
35170 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
35180 65 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74 68  e nNewPage is th
35190 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
351a0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
351b0 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  ore the.  ** con
351c0 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20 75  tents of pFrom u
351d0 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
351e0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54   page-size of pT
351f0 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50 61  o..  */.  nNewPa
35200 67 65 20 3d 20 28 28 69 36 34 29 6e 46 72 6f 6d  ge = ((i64)nFrom
35210 50 61 67 65 20 2a 20 28 69 36 34 29 6e 46 72 6f  Page * (i64)nFro
35220 6d 50 61 67 65 53 69 7a 65 20 2b 20 28 69 36 34  mPageSize + (i64
35230 29 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 31  )nToPageSize - 1
35240 29 20 2f 20 0a 20 20 20 20 20 20 28 69 36 34 29  ) / .      (i64)
35250 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  nToPageSize;..  
35260 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
35270 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e 54  ITE_OK && (i<=nT
35280 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77  oPage || i<=nNew
35290 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20  Page); i++){..  
352a0 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68 65    /* Journal the
352b0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2e 0a   original page..
352c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69 53      **.    ** iS
352d0 6b 69 70 20 69 73 20 74 68 65 20 70 61 67 65 20  kip is the page 
352e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 6f  number of the lo
352f0 63 6b 69 6e 67 20 70 61 67 65 20 28 50 45 4e 44  cking page (PEND
35300 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 29 0a 20  ING_BYTE_PAGE). 
35310 20 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73     ** in databas
35320 65 20 2a 70 54 6f 20 28 62 65 66 6f 72 65 20 74  e *pTo (before t
35330 68 65 20 63 6f 70 79 29 2e 20 54 68 69 73 20 70  he copy). This p
35340 61 67 65 20 69 73 20 6e 65 76 65 72 20 77 72 69  age is never wri
35350 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e 74  tten .    ** int
35360 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
35370 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69 53  le. Unless i==iS
35380 6b 69 70 20 6f 72 20 74 68 65 20 70 61 67 65 20  kip or the page 
35390 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70  was not.    ** p
353a0 72 65 73 65 6e 74 20 69 6e 20 70 54 6f 20 62 65  resent in pTo be
353b0 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 70  fore the copy op
353c0 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c  eration, journal
353d0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 54 6f   page i from pTo
353e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
353f0 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d   i!=iSkip && i<=
35400 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20  nToPage ){.     
35410 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
35420 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
35430 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
35440 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
35450 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  i, &pDbPage);.  
35460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35490 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
354a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
354b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
354c0 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20  >nFromPage ){.  
354d0 20 20 20 20 20 20 20 20 2f 2a 20 59 65 61 68 2e          /* Yeah.
354e0 20 20 49 74 20 73 65 65 6d 73 20 77 69 65 72 64    It seems wierd
354f0 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69   to call DontWri
35500 74 65 28 29 20 72 69 67 68 74 20 61 66 74 65 72  te() right after
35510 20 57 72 69 74 65 28 29 2e 20 42 75 74 0a 20 20   Write(). But.  
35520 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
35530 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 6e  is because the n
35540 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72  ames of those pr
35550 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20  ocedures do not 
35560 65 78 61 63 74 6c 79 20 0a 20 20 20 20 20 20 20  exactly .       
35570 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20     ** represent 
35580 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20 57  what they do.  W
35590 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d 65  rite() really me
355a0 61 6e 73 20 22 70 75 74 20 74 68 69 73 20 70 61  ans "put this pa
355b0 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ge in the.      
355c0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
355d0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b  journal and mark
355e0 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f 20   it as dirty so 
355f0 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
35600 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
35610 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
35620 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e  base file later.
35630 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75  "  DontWrite() u
35640 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64  ndoes the second
35650 20 70 61 72 74 20 6f 66 0a 20 20 20 20 20 20 20   part of.       
35660 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70     ** that and p
35670 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
35680 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
35690 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
356a0 61 73 65 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ase. The.       
356b0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74     ** page is st
356c0 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  ill on the rollb
356d0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f  ack journal, tho
356e0 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69  ugh.  And that i
356f0 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  s the .         
35700 20 2a 2a 20 77 68 6f 6c 65 20 70 6f 69 6e 74 20   ** whole point 
35710 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b 3a 20 74  of this block: t
35720 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e 20 74  o put pages on t
35730 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
35740 6e 61 6c 2e 20 0a 20 20 20 20 20 20 20 20 20 20  nal. .          
35750 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
35760 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
35770 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
35780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
35790 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
357a0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
357b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
357c0 20 4f 76 65 72 77 72 69 74 65 20 74 68 65 20 64   Overwrite the d
357d0 61 74 61 20 69 6e 20 70 61 67 65 20 69 20 6f 66  ata in page i of
357e0 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
357f0 62 61 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  base */.    if( 
35800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35810 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d   i!=iSkip && i<=
35820 6e 4e 65 77 50 61 67 65 20 29 7b 0a 0a 20 20 20  nNewPage ){..   
35830 20 20 20 44 62 50 61 67 65 20 2a 70 54 6f 50 61     DbPage *pToPa
35840 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ge = 0;.      sq
35850 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
35860 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
35870 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
35880 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  tTo->pPager, i, 
35890 26 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20  &pToPage);.     
358a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
358b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
358c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
358d0 72 69 74 65 28 70 54 6f 50 61 67 65 29 3b 0a 20  rite(pToPage);. 
358e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
358f0 72 28 0a 20 20 20 20 20 20 20 20 69 4f 66 66 3d  r(.        iOff=
35900 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a  (i-1)*nToPageSiz
35910 65 3b 20 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  e; .        rc==
35920 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66  SQLITE_OK && iOf
35930 66 3c 69 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b  f<i*nToPageSize;
35940 20 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b   .        iOff +
35950 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a  = nFromPageSize.
35960 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
35970 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61   DbPage *pFromPa
35980 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
35990 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f  Pgno iFrom = (iO
359a0 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  ff/nFromPageSize
359b0 29 2b 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  )+1;..        if
359c0 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47  ( iFrom==PENDING
359d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 46 72  _BYTE_PAGE(pBtFr
359e0 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  om) ){.         
359f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
35a00 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
35a10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
35a20 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  et(pBtFrom->pPag
35a30 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f  er, iFrom, &pFro
35a40 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
35a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35a60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  K ){.          c
35a70 68 61 72 20 2a 7a 54 6f 20 3d 20 73 71 6c 69 74  har *zTo = sqlit
35a80 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
35a90 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ToPage);.       
35aa0 20 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d     char *zFrom =
35ab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
35ac0 44 61 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b  Data(pFromPage);
35ad0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
35ae0 43 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20 20 20  Copy;..         
35af0 20 69 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69   if( nFromPageSi
35b00 7a 65 3e 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20  ze>=nToPageSize 
35b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
35b20 46 72 6f 6d 20 2b 3d 20 28 28 69 2d 31 29 2a 6e  From += ((i-1)*n
35b30 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 28 28 69  ToPageSize - ((i
35b40 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67  From-1)*nFromPag
35b50 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
35b60 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 54 6f       nCopy = nTo
35b70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  PageSize;.      
35b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b90 20 20 20 20 20 20 20 7a 54 6f 20 2b 3d 20 28 28         zTo += ((
35ba0 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50  (iFrom-1)*nFromP
35bb0 61 67 65 53 69 7a 65 29 20 2d 20 28 69 2d 31 29  ageSize) - (i-1)
35bc0 2a 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b 0a 20  *nToPageSize);. 
35bd0 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79             nCopy
35be0 20 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65   = nFromPageSize
35bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
35c00 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
35c10 7a 54 6f 2c 20 7a 46 72 6f 6d 2c 20 6e 43 6f 70  zTo, zFrom, nCop
35c20 79 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 50 61  y);..  sqlite3Pa
35c30 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61  gerUnref(pFromPa
35c40 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
35c50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
35c60 28 20 70 54 6f 50 61 67 65 20 29 20 73 71 6c 69  ( pToPage ) sqli
35c70 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54  te3PagerUnref(pT
35c80 6f 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  oPage);.    }.  
35c90 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 6e 67  }..  /* If thing
35ca0 73 20 68 61 76 65 20 77 6f 72 6b 65 64 20 73 6f  s have worked so
35cb0 20 66 61 72 2c 20 74 68 65 20 64 61 74 61 62 61   far, the databa
35cc0 73 65 20 66 69 6c 65 20 6d 61 79 20 6e 65 65 64  se file may need
35cd0 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 74 72 75   to be .  ** tru
35ce0 6e 63 61 74 65 64 2e 20 54 68 65 20 63 6f 6d 70  ncated. The comp
35cf0 6c 65 78 20 70 61 72 74 20 69 73 20 74 68 61 74  lex part is that
35d00 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
35d10 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  be truncated to.
35d20 20 20 2a 2a 20 61 20 73 69 7a 65 20 74 68 61 74    ** a size that
35d30 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
35d40 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 6e  er multiple of n
35d50 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 74 68 65  ToPageSize - the
35d60 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61   current.  ** pa
35d70 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
35d80 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
35d90 61 74 65 64 20 77 69 74 68 20 42 2d 54 72 65 65  ated with B-Tree
35da0 20 70 54 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   pTo..  **.  ** 
35db0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 61 79  For example, say
35dc0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
35dd0 66 20 70 54 6f 20 69 73 20 32 30 34 38 20 62 79  f pTo is 2048 by
35de0 74 65 73 20 61 6e 64 20 74 68 65 20 6f 72 69 67  tes and the orig
35df0 69 6e 61 6c 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  inal .  ** numbe
35e00 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 35 20  r of pages is 5 
35e10 28 31 30 20 4b 42 20 66 69 6c 65 29 2e 20 49 66  (10 KB file). If
35e20 20 70 46 72 6f 6d 20 68 61 73 20 61 20 70 61 67   pFrom has a pag
35e30 65 20 73 69 7a 65 20 6f 66 20 31 30 32 34 20 0a  e size of 1024 .
35e40 20 20 2a 2a 20 62 79 74 65 73 20 61 6e 64 20 39    ** bytes and 9
35e50 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
35e60 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
35e70 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 39  e truncated to 9
35e80 4b 42 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  KB..  */.  if( r
35e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35ea0 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61 67      if( nFromPag
35eb0 65 53 69 7a 65 21 3d 6e 54 6f 50 61 67 65 53 69  eSize!=nToPageSi
35ec0 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
35ed0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
35ee0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
35ef0 6c 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  le(pBtTo->pPager
35f00 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 69  );.      i64 iSi
35f10 7a 65 20 3d 20 28 69 36 34 29 6e 46 72 6f 6d 50  ze = (i64)nFromP
35f20 61 67 65 53 69 7a 65 20 2a 20 28 69 36 34 29 6e  ageSize * (i64)n
35f30 46 72 6f 6d 50 61 67 65 3b 0a 20 20 20 20 20 20  FromPage;.      
35f40 69 36 34 20 69 4e 6f 77 20 3d 20 28 69 36 34 29  i64 iNow = (i64)
35f50 28 28 6e 54 6f 50 61 67 65 3e 6e 4e 65 77 50 61  ((nToPage>nNewPa
35f60 67 65 29 3f 6e 54 6f 50 61 67 65 3a 6e 4e 65 77  ge)?nToPage:nNew
35f70 50 61 67 65 29 20 2a 20 28 69 36 34 29 6e 54 6f  Page) * (i64)nTo
35f80 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
35f90 20 69 36 34 20 69 50 65 6e 64 69 6e 67 20 3d 20   i64 iPending = 
35fa0 28 28 69 36 34 29 50 45 4e 44 49 4e 47 5f 42 59  ((i64)PENDING_BY
35fb0 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29 2d 31  TE_PAGE(pBtTo)-1
35fc0 29 20 2a 28 69 36 34 29 6e 54 6f 50 61 67 65 53  ) *(i64)nToPageS
35fd0 69 7a 65 3b 0a 20 20 0a 20 20 20 20 20 20 61 73  ize;.  .      as
35fe0 73 65 72 74 28 20 69 53 69 7a 65 3c 3d 69 4e 6f  sert( iSize<=iNo
35ff0 77 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  w );.  .      /*
36000 20 43 6f 6d 6d 69 74 20 70 68 61 73 65 20 6f 6e   Commit phase on
36010 65 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  e syncs the jour
36020 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  nal file associa
36030 74 65 64 20 77 69 74 68 20 70 54 6f 20 0a 20 20  ted with pTo .  
36040 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
36050 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  g the original d
36060 61 74 61 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  ata. It does not
36070 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
36080 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
36090 20 69 74 73 65 6c 66 2e 20 41 66 74 65 72 20 64   itself. After d
360a0 6f 69 6e 67 20 74 68 69 73 20 69 74 20 69 73 20  oing this it is 
360b0 73 61 66 65 20 74 6f 20 75 73 65 20 4f 73 54 72  safe to use OsTr
360c0 75 6e 63 61 74 65 28 29 20 61 6e 64 20 6f 74 68  uncate() and oth
360d0 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
360e0 20 41 50 49 73 20 6f 6e 20 74 68 65 20 64 61 74   APIs on the dat
360f0 61 62 61 73 65 20 66 69 6c 65 20 64 69 72 65 63  abase file direc
36100 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tly..      */.  
36110 20 20 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20      pBtTo->db = 
36120 70 54 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 72  pTo->db;.      r
36130 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36140 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
36150 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 30 2c  BtTo->pPager, 0,
36160 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66   0, 1);.      if
36170 28 20 69 53 69 7a 65 3c 69 4e 6f 77 20 26 26 20  ( iSize<iNow && 
36180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36190 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
361a0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
361b0 70 46 69 6c 65 2c 20 69 53 69 7a 65 29 3b 0a 20  pFile, iSize);. 
361c0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
361d0 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74  /* The loop that
361e0 20 63 6f 70 69 65 64 20 64 61 74 61 20 66 72 6f   copied data fro
361f0 6d 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d  m database pFrom
36200 20 74 6f 20 70 54 6f 20 64 69 64 20 6e 6f 74 0a   to pTo did not.
36210 20 20 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74        ** populat
36220 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
36230 67 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 70  ge of database p
36240 54 6f 2e 20 49 66 20 74 68 65 20 70 61 67 65 2d  To. If the page-
36250 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  size of.      **
36260 20 70 46 72 6f 6d 20 69 73 20 73 6d 61 6c 6c 65   pFrom is smalle
36270 72 20 74 68 61 6e 20 74 68 61 74 20 6f 66 20 70  r than that of p
36280 54 6f 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  To, this means s
36290 6f 6d 65 20 64 61 74 61 20 77 69 6c 6c 0a 20 20  ome data will.  
362a0 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20      ** not have 
362b0 62 65 65 6e 20 63 6f 70 69 65 64 2e 20 0a 20 20  been copied. .  
362c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
362d0 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 70 69 65  This block copie
362e0 73 20 74 68 65 20 6d 69 73 73 69 6e 67 20 64 61  s the missing da
362f0 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  ta from database
36300 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 0a 20   pFrom to pTo . 
36310 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 66 69       ** using fi
36320 6c 65 20 41 50 49 73 2e 20 54 68 69 73 20 69 73  le APIs. This is
36330 20 73 61 66 65 20 62 65 63 61 75 73 65 20 61 74   safe because at
36340 20 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 6b   this point we k
36350 6e 6f 77 20 74 68 61 74 0a 20 20 20 20 20 20 2a  now that.      *
36360 2a 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 72 69  * all of the ori
36370 67 69 6e 61 6c 20 64 61 74 61 20 66 72 6f 6d 20  ginal data from 
36380 70 54 6f 20 68 61 73 20 62 65 65 6e 20 73 79 6e  pTo has been syn
36390 63 65 64 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ced into the .  
363a0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
363b0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
363c0 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 73  nt it would be s
363d0 61 66 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69  afe to do anythi
363e0 6e 67 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 61  ng at.      ** a
363f0 6c 6c 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ll to the databa
36400 73 65 20 66 69 6c 65 20 65 78 63 65 70 74 20 74  se file except t
36410 72 75 6e 63 61 74 65 20 69 74 20 74 6f 20 7a 65  runcate it to ze
36420 72 6f 20 62 79 74 65 73 2e 0a 20 20 20 20 20 20  ro bytes..      
36430 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
36440 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 46  =SQLITE_OK && nF
36450 72 6f 6d 50 61 67 65 53 69 7a 65 3c 6e 54 6f 50  romPageSize<nToP
36460 61 67 65 53 69 7a 65 20 26 26 20 69 53 69 7a 65  ageSize && iSize
36470 3e 69 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  >iPending){.    
36480 20 20 20 20 69 36 34 20 69 4f 66 66 3b 0a 20 20      i64 iOff;.  
36490 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20        for(.     
364a0 20 20 20 20 20 69 4f 66 66 3d 69 50 65 6e 64 69       iOff=iPendi
364b0 6e 67 3b 20 0a 20 20 20 20 20 20 20 20 20 20 72  ng; .          r
364c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
364d0 69 4f 66 66 3c 28 69 50 65 6e 64 69 6e 67 2b 6e  iOff<(iPending+n
364e0 54 6f 50 61 67 65 53 69 7a 65 29 3b 20 0a 20 20  ToPageSize); .  
364f0 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
36500 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20  nFromPageSize.  
36510 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
36520 20 20 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d     DbPage *pFrom
36530 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
36540 20 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d      Pgno iFrom =
36550 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65   (iOff/nFromPage
36560 53 69 7a 65 29 2b 31 3b 0a 20 20 0a 20 20 20 20  Size)+1;.  .    
36570 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
36580 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
36590 47 45 28 70 42 74 46 72 6f 6d 29 20 7c 7c 20 69  GE(pBtFrom) || i
365a0 46 72 6f 6d 3e 6e 46 72 6f 6d 50 61 67 65 20 29  From>nFromPage )
365b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
365c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
365d0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
365e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
365f0 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70  erGet(pBtFrom->p
36600 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70  Pager, iFrom, &p
36610 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
36620 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36640 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 72 6f        char *zFro
36650 6d 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  m = sqlite3Pager
36660 47 65 74 44 61 74 61 28 70 46 72 6f 6d 50 61 67  GetData(pFromPag
36670 65 29 3b 0a 20 20 09 20 20 72 63 20 3d 20 73 71  e);.  .  rc = sq
36680 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 46 69  lite3OsWrite(pFi
36690 6c 65 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d  le, zFrom, nFrom
366a0 50 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 29 3b  PageSize, iOff);
366b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
366c0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
366d0 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
366e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
366f0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
36700 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
36710 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
36720 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36740 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36750 67 65 72 53 79 6e 63 28 70 42 74 54 6f 2d 3e 70  gerSync(pBtTo->p
36760 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
36770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36790 65 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f  erTruncate(pBtTo
367a0 2d 3e 70 50 61 67 65 72 2c 20 6e 4e 65 77 50 61  ->pPager, nNewPa
367b0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
367c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
367d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 54 6f 2d   ){.      pBtTo-
367e0 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
367f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
36800 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
36810 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
36820 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 0a 20  ack(pTo);.  }.. 
36830 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
36840 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
36850 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
36860 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
36870 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
36880 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
36890 72 28 70 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65  r(pTo);.  sqlite
368a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 46 72 6f  3BtreeEnter(pFro
368b0 6d 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  m);.  rc = btree
368c0 43 6f 70 79 46 69 6c 65 28 70 54 6f 2c 20 70 46  CopyFile(pTo, pF
368d0 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rom);.  sqlite3B
368e0 74 72 65 65 4c 65 61 76 65 28 70 46 72 6f 6d 29  treeLeave(pFrom)
368f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
36900 4c 65 61 76 65 28 70 54 6f 29 3b 0a 20 20 72 65  Leave(pTo);.  re
36910 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
36920 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
36930 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  T_VACUUM */../*.
36940 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
36950 72 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ro if a transact
36960 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
36970 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
36980 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65  eeIsInTrans(Btre
36990 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
369a0 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   p==0 || sqlite3
369b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
369c0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
369d0 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
369e0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
369f0 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  RITE));.}../*.**
36a00 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
36a10 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
36a20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
36a30 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
36a40 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74  lite3BtreeIsInSt
36a50 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
36a60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
36a70 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
36a80 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ) );.  return (p
36a90 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d  ->pBt && p->pBt-
36aa0 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  >inStmt);.}../*.
36ab0 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
36ac0 72 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72  ro if a read (or
36ad0 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
36ae0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
36af0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
36b00 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
36b10 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
36b20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
36b30 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
36b40 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
36b50 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72  n (p && (p->inTr
36b60 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29  ans!=TRANS_NONE)
36b70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
36b80 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
36b90 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
36ba0 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
36bb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
36bc0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72  ** a single shar
36bd0 65 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65  ed-btree. The me
36be0 6d 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20  mory is used by 
36bf0 63 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20  client code for 
36c00 69 74 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f  its own.** purpo
36c10 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  ses (for example
36c20 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67  , to store a hig
36c30 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61  h-level schema a
36c40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
36c50 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ** the shared-bt
36c60 72 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20  ree). The btree 
36c70 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65  layer manages re
36c80 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67  ference counting
36c90 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   issues..**.** T
36ca0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
36cb0 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  is is called on 
36cc0 61 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20  a shared-btree, 
36cd0 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20  nBytes bytes of 
36ce0 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c  memory.** are al
36cf0 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c  located, zeroed,
36d00 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f   and returned to
36d10 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72   the caller. For
36d20 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
36d30 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42   .** call the nB
36d40 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69  ytes parameter i
36d50 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20  s ignored and a 
36d60 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
36d70 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d  ame blob.** of m
36d80 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20  emory returned. 
36d90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 42  .**.** If the nB
36da0 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69  ytes parameter i
36db0 73 20 30 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  s 0 and the blob
36dc0 20 6f 66 20 6d 65 6d 6f 72 79 20 68 61 73 20 6e   of memory has n
36dd0 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 61  ot yet been.** a
36de0 6c 6c 6f 63 61 74 65 64 2c 20 61 20 6e 75 6c 6c  llocated, a null
36df0 20 70 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75   pointer is retu
36e00 72 6e 65 64 2e 20 49 66 20 74 68 65 20 62 6c 6f  rned. If the blo
36e10 62 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  b has already be
36e20 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c  en.** allocated,
36e30 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
36e40 61 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2a 0a 2a 2a  as normal..**.**
36e50 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   Just before the
36e60 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73   shared-btree is
36e70 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e   closed, the fun
36e80 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ction passed as 
36e90 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72  the .** xFree ar
36ea0 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20  gument when the 
36eb0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
36ec0 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e  n was made is in
36ed0 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a  voked on the .**
36ee0 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74   blob of allocat
36ef0 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20  ed memory. This 
36f00 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
36f10 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  not call sqlite3
36f20 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68  _free().** on th
36f30 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74  e memory, the bt
36f40 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74  ree layer does t
36f50 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  hat..*/.void *sq
36f60 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
36f70 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
36f80 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72  Bytes, void(*xFr
36f90 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20  ee)(void *)){.  
36fa0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
36fb0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
36fc0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
36fd0 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68    if( !pBt->pSch
36fe0 65 6d 61 20 26 26 20 6e 42 79 74 65 73 20 29 7b  ema && nBytes ){
36ff0 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65 6d  .    pBt->pSchem
37000 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  a = sqlite3Mallo
37010 63 5a 65 72 6f 28 6e 42 79 74 65 73 29 3b 0a 20  cZero(nBytes);. 
37020 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
37030 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d  ema = xFree;.  }
37040 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
37050 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
37060 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a  n pBt->pSchema;.
37070 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
37080 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65 72 20  true if another 
37090 75 73 65 72 20 6f 66 20 74 68 65 20 73 61 6d 65  user of the same
370a0 20 73 68 61 72 65 64 20 62 74 72 65 65 20 61 73   shared btree as
370b0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a   the argument.**
370c0 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e   handle holds an
370d0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
370e0 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
370f0 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ster table..*/.i
37100 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
37110 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65  chemaLocked(Btre
37120 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
37130 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37140 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
37150 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
37160 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
37170 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 71  er(p);.  rc = (q
37180 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
37190 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
371a0 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45  AD_LOCK)!=SQLITE
371b0 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  _OK);.  sqlite3B
371c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
371d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23  return rc;.}...#
371e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
371f0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
37200 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c  /*.** Obtain a l
37210 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
37220 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65   whose root page
37230 20 69 73 20 69 54 61 62 2e 20 20 54 68 65 0a 2a   is iTab.  The.*
37240 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77 72 69 74  * lock is a writ
37250 65 20 6c 6f 63 6b 20 69 66 20 69 73 57 72 69 74  e lock if isWrit
37260 65 6c 6f 63 6b 20 69 73 20 74 72 75 65 20 6f 72  elock is true or
37270 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20   a read lock.** 
37280 69 66 20 69 74 20 69 73 20 66 61 6c 73 65 2e 0a  if it is false..
37290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
372a0 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72  reeLockTable(Btr
372b0 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c  ee *p, int iTab,
372c0 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 29   u8 isWriteLock)
372d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
372e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
372f0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
37300 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 52   u8 lockType = R
37310 45 41 44 5f 4c 4f 43 4b 20 2b 20 69 73 57 72 69  EAD_LOCK + isWri
37320 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 61 73 73 65  teLock;.    asse
37330 72 74 28 20 52 45 41 44 5f 4c 4f 43 4b 2b 31 3d  rt( READ_LOCK+1=
37340 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
37350 20 20 20 61 73 73 65 72 74 28 20 69 73 57 72 69     assert( isWri
37360 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73 57  teLock==0 || isW
37370 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  riteLock==1 );. 
37380 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
37390 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
373a0 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
373b0 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
373c0 70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  pe);.    if( rc=
373d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
373e0 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62      rc = lockTab
373f0 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b  le(p, iTab, lock
37400 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Type);.    }.   
37410 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
37420 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
37430 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
37440 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
37450 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
37460 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43  *.** Argument pC
37470 73 72 20 6d 75 73 74 20 62 65 20 61 20 63 75 72  sr must be a cur
37480 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  sor opened for w
37490 72 69 74 69 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a  riting on an .**
374a0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 20 63 75   INTKEY table cu
374b0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
374c0 20 61 74 20 61 20 76 61 6c 69 64 20 74 61 62 6c   at a valid tabl
374d0 65 20 65 6e 74 72 79 2e 20 0a 2a 2a 20 54 68 69  e entry. .** Thi
374e0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66  s function modif
374f0 69 65 73 20 74 68 65 20 64 61 74 61 20 73 74 6f  ies the data sto
37500 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
37510 68 61 74 20 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e  hat entry..** On
37520 6c 79 20 74 68 65 20 64 61 74 61 20 63 6f 6e 74  ly the data cont
37530 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ent may only be 
37540 6d 6f 64 69 66 69 65 64 2c 20 69 74 20 69 73 20  modified, it is 
37550 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20  not possible.** 
37560 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 6c 65  to change the le
37570 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
37580 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20   stored..*/.int 
37590 73 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44  sqlite3BtreePutD
375a0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
375b0 73 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  sr, u32 offset, 
375c0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 7a  u32 amt, void *z
375d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
375e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
375f0 73 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sr) );.  assert(
37600 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
37610 65 6c 64 28 70 43 73 72 2d 3e 70 42 74 72 65 65  eld(pCsr->pBtree
37620 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
37630 20 20 61 73 73 65 72 74 28 70 43 73 72 2d 3e 69    assert(pCsr->i
37640 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29  sIncrblobHandle)
37650 3b 0a 0a 20 20 72 65 73 74 6f 72 65 4f 72 43 6c  ;..  restoreOrCl
37660 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
37670 6e 28 70 43 73 72 29 3b 0a 20 20 61 73 73 65 72  n(pCsr);.  asser
37680 74 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 21  t( pCsr->eState!
37690 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
376a0 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 73  EEK );.  if( pCs
376b0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
376c0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
376d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
376e0 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  RT;.  }..  /* Ch
376f0 65 63 6b 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64  eck some precond
37700 69 74 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20  itions: .  **   
37710 28 61 29 20 74 68 65 20 63 75 72 73 6f 72 20 69  (a) the cursor i
37720 73 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  s open for writi
37730 6e 67 2c 0a 20 20 2a 2a 20 20 20 28 62 29 20 74  ng,.  **   (b) t
37740 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 64 2d  here is no read-
37750 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
37760 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  e being modified
37770 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
37780 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
37790 73 20 61 74 20 61 20 76 61 6c 69 64 20 72 6f 77  s at a valid row
377a0 20 6f 66 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   of an intKey ta
377b0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
377c0 21 70 43 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCsr->wrFlag ){
377d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
377e0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
377f0 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 73 72  .  assert( !pCsr
37800 2d 3e 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ->pBt->readOnly 
37810 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 43  .          && pC
37820 73 72 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  sr->pBt->inTrans
37830 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
37840 49 54 45 20 29 3b 0a 20 20 69 66 28 20 63 68 65  ITE );.  if( che
37850 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 73 72  ckReadLocks(pCsr
37860 2d 3e 70 42 74 72 65 65 2c 20 70 43 73 72 2d 3e  ->pBtree, pCsr->
37870 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 73 72 2c 20  pgnoRoot, pCsr, 
37880 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
37890 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
378a0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
378b0 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
378c0 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
378d0 20 7d 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65   }.  if( pCsr->e
378e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
378f0 56 41 4c 49 44 20 7c 7c 20 21 70 43 73 72 2d 3e  VALID || !pCsr->
37900 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
37910 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
37920 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
37930 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
37940 79 6c 6f 61 64 28 70 43 73 72 2c 20 6f 66 66 73  yload(pCsr, offs
37950 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
37960 65 64 20 63 68 61 72 20 2a 29 7a 2c 20 30 2c 20  ed char *)z, 0, 
37970 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65  1);.}../* .** Se
37980 74 20 61 20 66 6c 61 67 20 6f 6e 20 74 68 69 73  t a flag on this
37990 20 63 75 72 73 6f 72 20 74 6f 20 63 61 63 68 65   cursor to cache
379a0 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 6f   the locations o
379b0 66 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  f pages from the
379c0 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 6c 69   .** overflow li
379d0 73 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  st for the curre
379e0 6e 74 20 72 6f 77 2e 20 54 68 69 73 20 69 73 20  nt row. This is 
379f0 75 73 65 64 20 62 79 20 63 75 72 73 6f 72 73 20  used by cursors 
37a00 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f 72 20 69 6e  opened.** for in
37a10 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 49  cremental blob I
37a20 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  O only..**.** Th
37a30 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
37a40 20 61 20 66 6c 61 67 20 6f 6e 6c 79 2e 20 54 68   a flag only. Th
37a50 65 20 61 63 74 75 61 6c 20 70 61 67 65 20 6c 6f  e actual page lo
37a60 63 61 74 69 6f 6e 20 63 61 63 68 65 0a 2a 2a 20  cation cache.** 
37a70 28 73 74 6f 72 65 64 20 69 6e 20 42 74 43 75 72  (stored in BtCur
37a80 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 29  sor.aOverflow[])
37a90 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
37aa0 64 20 75 73 65 64 20 62 79 20 66 75 6e 63 74 69  d used by functi
37ab0 6f 6e 0a 2a 2a 20 61 63 63 65 73 73 50 61 79 6c  on.** accessPayl
37ac0 6f 61 64 28 29 20 28 74 68 65 20 77 6f 72 6b 65  oad() (the worke
37ad0 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73  r function for s
37ae0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
37af0 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33  ) and.** sqlite3
37b00 42 74 72 65 65 50 75 74 44 61 74 61 28 29 29 2e  BtreePutData()).
37b10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
37b20 42 74 72 65 65 43 61 63 68 65 4f 76 65 72 66 6c  BtreeCacheOverfl
37b30 6f 77 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ow(BtCursor *pCu
37b40 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
37b50 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
37b60 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
37b70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
37b80 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
37b90 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
37ba0 0a 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d  .  assert(!pCur-
37bb0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
37bc0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43  e);.  assert(!pC
37bd0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
37be0 20 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c    pCur->isIncrbl
37bf0 6f 62 48 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a  obHandle = 1;.}.
37c00 23 65 6e 64 69 66 0a                             #endif.